📜  JavaScript 中的可枚举属性是什么意思?(1)

📅  最后修改于: 2023-12-03 14:42:30.367000             🧑  作者: Mango

JavaScript 中的可枚举属性是什么意思?

在 JavaScript 中,对象的属性可以被标记为可枚举(enumerable)或不可枚举(non-enumerable)。这个属性的标记决定了能否通过遍历对象的属性列表或使用一些特定的操作访问到该属性。

可枚举属性的含义

可枚举属性是指那些在对象的属性列表中会显示的属性,也就是可以通过遍历对象的属性获取到的属性。当我们使用 for-in 循环或 Object.keys() 方法遍历对象时,只会包含可枚举属性。

如何确定属性是否可枚举?

在 JavaScript 中,我们可以使用以下方式确定属性是否可枚举:

  1. 使用 Object.getOwnPropertyDescriptor(obj, prop) 方法获得属性的属性描述符,并查看 enumerable 字段的值。
const obj = { name: 'John' };

const descriptor = Object.getOwnPropertyDescriptor(obj, 'name');
console.log(descriptor.enumerable); // true
  1. 使用 Object.prototype.propertyIsEnumerable(prop) 方法检查属性是否可枚举。
const obj = { name: 'John' };

console.log(obj.propertyIsEnumerable('name')); // true
默认可枚举性

在 JavaScript 中,大部分内建对象的属性是可枚举的。例如,ArrayObjectFunction 等对象的原型链上的属性通常是可枚举的。

const arr = [1, 2, 3];

console.log(arr.propertyIsEnumerable('length')); // true

然而,有一些内建对象的属性是不可枚举的,例如 DateRegExp 等对象的部分属性。

修改属性的可枚举性

我们可以使用 Object.defineProperty(obj, prop, descriptor) 方法来修改属性的可枚举性。通过在属性描述符中设置 enumerable 字段为 false,可以将属性标记为不可枚举。

const obj = { name: 'John' };

Object.defineProperty(obj, 'name', { enumerable: false });

console.log(obj.propertyIsEnumerable('name')); // false

或者,我们也可以使用 Object.defineProperties(obj, props) 方法一次修改多个属性的可枚举性。

const obj = { name: 'John', age: 25 };

Object.defineProperties(obj, {
  name: { enumerable: false },
  age: { enumerable: false }
});

console.log(obj.propertyIsEnumerable('name')); // false
console.log(obj.propertyIsEnumerable('age')); // false
总结

可枚举属性在 JavaScript 中决定了属性能否被遍历或使用一些特定的操作获取到。默认情况下,大部分内建对象的属性是可枚举的,但可以通过 Object.defineProperty()Object.defineProperties() 方法来修改属性的可枚举性。了解和掌握可枚举属性对于JavaScript开发者来说是非常重要的。