object.entries()只返回对象自身且enumerable为true的属性键值对。它忽略writable、configurable等其他描述符,也不访问原型链;不可枚举属性无论其他特性如何均不出现。

Object.entries() 的返回值不受属性描述符影响,只要属性是自身、可枚举(enumerable: true),就会被包含;不可枚举属性(enumerable: false)无论其他描述符(如 writable、configurable)如何,一律不出现。
Object.entries 只关心 enumerable 标志
Object.entries(obj) 严格筛选对象自身的、enumerable === true 的属性。它完全忽略以下描述符:
-
writable(是否可写) -
configurable(是否可配置) -
value或get/set存在与否 - 属性是否为
undefined或null
✅ 只要满足:
- 是对象自身属性(非原型链继承)
-
enumerable: true(默认就是 true)
就会进入返回的二维数组。
例如:
const obj = { a: 1 };
// 添加一个不可枚举属性
Object.defineProperty(obj, 'b', {
value: 2,
enumerable: false, // ? 关键:设为 false
writable: true,
configurable: true
});
console.log(Object.entries(obj)); // [['a', 1]] —— 'b' 不会出现
不可枚举属性常见来源
这些情况下的属性不会被 Object.entries 捕获:
- 用
Object.defineProperty显式设enumerable: false -
Object.create(null)创建的对象(无原型,但不影响自身属性) -
JSON.stringify()默认跳过不可枚举属性(行为一致) - 类数组对象(如
arguments)中部分内置属性可能不可枚举
注意:for...in 会遍历原型链上可枚举属性,而 Object.entries 只看自身,且要求 enumerable: true。
如何检查某个属性是否会被 Object.entries 包含?
可用 Object.getOwnPropertyDescriptor(obj, key) 查看:
const obj = { a: 1 };
Object.defineProperty(obj, 'b', { value: 2, enumerable: false });
console.log(Object.getOwnPropertyDescriptor(obj, 'a'));
// { value: 1, writable: true, enumerable: true, configurable: true }
console.log(Object.getOwnPropertyDescriptor(obj, 'b'));
// { value: 2, writable: true, enumerable: false, configurable: true }
// ↑ enumerable: false → Object.entries 忽略它
对比其他方法的处理逻辑
| 方法 | 是否受 enumerable 影响 |
是否访问原型链 | 是否包含不可枚举属性 |
|---|---|---|---|
Object.keys() |
✅ 是 | ❌ 否 | ❌ 否 |
Object.values() |
✅ 是 | ❌ 否 | ❌ 否 |
Object.entries() |
✅ 是 | ❌ 否 | ❌ 否 |
for...in |
✅ 是 | ✅ 是 | ❌ 否 |
Object.getOwnPropertyNames() |
❌ 否 | ❌ 否 | ✅ 是(所有自身属性) |
Object.getOwnPropertyDescriptors() |
❌ 否 | ❌ 否 | ✅ 是 |
所以如果你需要“不管可不可枚举都拿出来”,得换用 Object.getOwnPropertyNames() + 手动取值,或 Object.getOwnPropertyDescriptors()。
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











