enumerable 控制属性是否在 for…in、Object.keys()、JSON.stringify() 等枚举操作中出现;设为 false 时仍可直接访问,但不参与遍历和序列化,默认值依创建方式而异。

enumerable 决定一个属性是否能在 for……in 循环或 Object.keys()、Object.getOwnPropertyNames()(注意:这个不看 enumerable)、JSON.stringify() 等枚举操作中被“看到”和访问。
控制属性是否出现在常规遍历中
当 enumerable: false 时,该属性不会出现在:
-
for……in循环(跳过该属性) -
Object.keys(obj)返回的数组里(不包含它) -
JSON.stringify(obj)的结果中(被忽略)
但它依然可以被直接通过点号或方括号访问,也不影响 Object.getOwnPropertyNames() 或 Object.getOwnPropertyDescriptor() 的结果。
默认值与显式设置
使用字面量创建对象时,所有属性默认 enumerable: true;用 Object.defineProperty() 定义时,默认为 false。
立即学习 “Java 免费学习笔记(深入)”;
例如:
const obj = {a: 1}; Object.defineProperty(obj, 'b', { value: 2}); // enumerable 默认 false Object.defineProperty(obj, 'c', { value: 3, enumerable: true}); console.log(Object.keys(obj)); // ['a', 'c'] console.log('b' in obj); // true(可访问)console.log(obj.b); // 2(可读取)
实际用途举例
常用于隐藏内部状态或避免被序列化 / 遍历时暴露:
- 定义私有字段(虽非真正私有,但能限制枚举行为)
- 避免
JSON.stringify()把缓存、元数据等冗余信息带出去 - 配合
writable和configurable实现更精细的属性控制






























