受enumerable控制的操作包括for...in循环、object.keys()、json.stringify()和object.assign();不受影响的有直接属性访问、object.getownpropertynames()、object.getownpropertydescriptors()及reflect.ownkeys()。

JavaScript中,enumerable(可枚举性)决定了一个属性是否会在 for...in 循环、Object.keys()、JSON.stringify() 等操作中被访问到。它不控制属性能否被读写,只影响“是否出现在遍历结果里”。
哪些操作受 enumerable 控制?
以下方法会跳过 enumerable: false 的属性:
-
for...in循环(只遍历自身 + 原型链上可枚举的属性) -
Object.keys(obj)(只返回自身可枚举属性名) -
JSON.stringify(obj)(忽略不可枚举、函数、undefined、Symbol 属性) -
Object.assign({}, obj)(只拷贝自身可枚举属性)
哪些操作不受 enumerable 影响?
这些操作能访问到所有属性(包括不可枚举的),只要它们存在且可访问:
- 直接通过点号或方括号访问:
obj.prop或obj["prop"] -
Object.getOwnPropertyNames(obj)(返回所有自身属性名,含不可枚举) -
Object.getOwnPropertyDescriptors(obj)(返回所有自身属性描述符) -
Reflect.ownKeys(obj)(返回所有自身键,含不可枚举和 Symbol)
如何设置或修改 enumerable?
只能通过 Object.defineProperty() 或 Object.defineProperties() 显式设置:
// 默认为 trueconst obj = { a: 1 };Object.defineProperty(obj, "b", { value: 2, enumerable: false });console.log(Object.keys(obj)); // ["a"]console.log(obj.b); // 2(仍可正常读取)
常见不可枚举属性的来源
- 对象的内置方法,如
Array.prototype.forEach在原型上是不可枚举的 - 使用
Object.defineProperty()显式设为enumerable: false - 类中定义的方法(在原型上,默认不可枚举)
// class A { method() {} } → A.prototype.method.enumerable === false -
__proto__访问器属性(在部分环境中不可枚举)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











