object.entries只返回对象自身可枚举属性的键值对,忽略不可枚举属性、原型链属性及内置不可枚举方法;其行为等价于object.keys()后取值,不支持直接获取不可枚举属性。

Object.entries 只返回对象自身可枚举(enumerable)属性的键值对,完全忽略不可枚举属性,无论该属性是通过 Object.defineProperty 显式设为 enumerable: false,还是原型链上的属性,或是内置不可枚举属性(如 constructor、toString 等)。
只遍历自身可枚举属性
Object.entries 的行为与 for...in 不同:它不遍历原型链,也不处理不可枚举属性。它等价于先用 Object.keys() 获取可枚举键名,再对每个键取值组成数组。
- 如果一个属性被定义为
enumerable: false,即使在对象自身上,也不会出现在Object.entries()结果中 - 从原型继承的属性,无论是否可枚举,一律不包含
- 常见内置方法(如
hasOwnProperty、valueOf)默认不可枚举,不会被列出
对比其他遍历方式
理解差异有助于判断何时该用什么方法:
-
Object.keys(obj):和Object.entries()一样,只返回自身可枚举属性的键 -
Object.getOwnPropertyNames(obj):返回所有自身属性名(包括不可枚举的),但不包含 symbol 属性 -
Object.getOwnPropertyDescriptors(obj):返回所有自身属性的完整描述符(含enumerable字段),可用于识别哪些不可枚举 -
Reflect.ownKeys(obj):返回所有自身键(包括字符串键和 Symbol 键),不管是否可枚举
如何获取不可枚举属性的键值对?
Object.entries 本身不支持,但可以手动构造:
- 用
Object.getOwnPropertyNames(obj)获取所有自身字符串键 - 用
Object.getOwnPropertySymbols(obj)补上 Symbol 键 - 对每个键调用
Object.getOwnPropertyDescriptor(obj, key),检查enumerable是否为false,再决定是否推入结果 - 注意:不可枚举属性若为 accessor(getter/setter),需用
get或value字段安全读取,避免意外执行 getter
实际例子
例如:
const obj = { a: 1 };Object.defineProperty(obj, 'b', { value: 2, enumerable: false });
Object.defineProperty(obj, 'c', { get() { return 3; }, enumerable: false });
console.log(Object.entries(obj)); // [['a', 1]] —— b 和 c 都被跳过
console.log(Object.getOwnPropertyNames(obj)); // ['a', 'b', 'c']
console.log(Object.getOwnPropertyDescriptor(obj, 'b')); // { value: 2, writable: true, enumerable: false, configurable: true }
不可枚举属性不是“隐藏”或“删除”,只是被设计为不参与常规遍历。Object.entries 按规范严格遵循可枚举性约定,这是它的预期行为,而非缺陷。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











