Object.keys()返回对象自身可枚举属性的键名数组;不包含继承属性和不可枚举属性,顺序与for...in一致。需获取不可枚举属性用Object.getOwnPropertyNames(),含Symbol键用Reflect.ownKeys()。

用 Object.keys() 方法即可获取对象所有可枚举的自有属性键名数组。
基础用法:Object.keys()
这是最常用、最直接的方式,返回一个包含对象自身可枚举属性(即不包括原型链上的属性)键名的字符串数组:
- 只遍历对象自身的属性,不包含继承来的属性
- 只返回可枚举(
enumerable: true)的属性键 - 返回顺序与
for...in循环一致(通常为定义顺序,但对数字键会按数值升序排列)
示例:
const obj = { a: 1, b: 2, 1: 'num', 0: 'zero' };console.log(Object.keys(obj)); // ['0', '1', 'a', 'b']
想获取所有自有属性(包括不可枚举的)?用 Object.getOwnPropertyNames()
如果对象中存在 enumerable: false 的属性(比如通过 Object.defineProperty 设置的),Object.keys() 会忽略它们,此时应使用:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Object.getOwnPropertyNames(obj):返回所有自有属性键名(无论是否可枚举) -
Object.getOwnPropertySymbols(obj):单独获取所有自有 Symbol 类型键
组合使用可覆盖全部自有键:
const obj = { a: 1 };Object.defineProperty(obj, 'hidden', { value: 2, enumerable: false });
console.log(Object.keys(obj)); // ['a']
console.log(Object.getOwnPropertyNames(obj)); // ['a', 'hidden']
需要包含原型链上的可枚举键?手动遍历 + hasOwnProperty
Object.keys() 和 getOwnPropertyNames() 都不查原型链。若需获取整个原型链上所有可枚举键(类似 for...in 的范围),可用:
- 循环
for...in+hasOwnProperty过滤,再收集键名 - 或用
Reflect.ownKeys()获取当前对象所有键(含 Symbol 和不可枚举),再递归向上查原型
简单兼容方案(仅可枚举,含原型):
function getAllEnumerableKeys(obj) {const keys = [];
for (let key in obj) keys.push(key);
return keys;
}
console.log(getAllEnumerableKeys({ b: 2 })); // 如继承自 Object.prototype,可能含 'toString' 等
ES2015+ 补充:Reflect.ownKeys() 更全面
Reflect.ownKeys(obj) 是目前最完整的自有键获取方式,它等价于:
- 同时包含字符串键和 Symbol 键
- 同时包含可枚举和不可枚举的自有属性
- 不包含原型链上的任何键
适合需要完整键集的场景,比如实现深拷贝、代理拦截或序列化逻辑。

















