Object.keys()仅返回对象自身且可枚举(enumerable: true)的属性名;需同时满足“自有属性”和“[[Enumerable]]为true”两个条件,不可枚举属性、原型链属性及Symbol键均被忽略。

Object.keys() 只返回对象自身可枚举(enumerable: true)的属性名,不可枚举属性完全不会出现在结果中。
哪些属性会被 Object.keys() 返回
只有满足两个条件的属性才会被包含:
- 属于对象自身(不从原型链继承)
- [[Enumerable]] 内部特性为 true
例如普通赋值或对象字面量定义的属性,默认 enumerable 为 true,所以都会被 keys 捕获:
const obj = { a: 1, b: 2 };console.log(Object.keys(obj)); // ['a', 'b']
不可枚举属性会被 Object.keys() 忽略
通过 Object.defineProperty 显式设置 enumerable: false 的属性,即使真实存在、可读可写,也不会出现在 keys 结果里:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Object.defineProperty(obj, 'hidden', {
value: 42,
enumerable: false
});
console.log(Object.keys(obj)); // ['a'] —— 'hidden' 不出现
同样,某些原生方法(如 Object.prototype 上的部分属性)或手动设为不可枚举的 constructor,也不会被 keys 列出。
如何判断某个属性是否可枚举
可以用 propertyIsEnumerable() 方法验证:
- obj.propertyIsEnumerable('key') 返回 true 表示该属性可枚举,Object.keys() 会包含它
- 返回 false 表示不可枚举,Object.keys() 一定跳过它
注意:这个方法只检测自有属性,不检测原型链上的属性是否可枚举。
对比其他遍历方式更清楚区别
Object.keys() 的“可枚举性过滤”是它的核心特征,和下面操作形成对比:
- Object.getOwnPropertyNames():返回所有自有属性名,不管 enumerable 是 true 还是 false
- Reflect.ownKeys():返回所有自有属性键(包括 Symbol),也不受 enumerable 控制
- for...in:会遍历自身 + 原型链上可枚举的属性,范围比 keys 更广

















