JavaScript中对象属性描述符enumerable的作用

1次阅读

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

JavaScript 中对象属性描述符 enumerable 的作用

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() 把缓存、元数据等冗余信息带出去
  • 配合 writableconfigurable 实现更精细的属性控制

text=ZqhQzanResources