JavaScript属性的可枚举性

在大多数情况下,对象属性默认是可枚举的,除非它们是Symbols。这意味着你可以使用for...in循环来迭代对象的属性。同样,可枚举的属性会出现在枚举对象属性的方法中。一个例子是Object.keys()方法,它会省略不可枚举的属性。最后,当使用对象展开运算符(...)时,只有可枚举的属性会被复制到新对象中。

const person = {
  name: 'John',
  surname: 'Doe',
  age: 30,
  socialSecurityNumber: '123-45-6789',
};

Object.defineProperty(person, 'socialSecurityNumber', {
  enumerable: false,
});

person.hasOwnProperty('socialSecurityNumber'); // true
person.propertyIsEnumerable('socialSecurityNumber'); // false

Object.keys(person); // ['name', 'surname', 'age']
Object.getOwnPropertyNames(person);
// ['name', 'surname', 'age', 'socialSecurityNumber']

const clone = { ...person };
clone.socialSecurityNumber; // undefined

要创建一个不可枚举的属性,你可以使用适当的描述符来调用Object.defineProperty()。你可以使用Object.prototype.hasOwnProperty()来检查属性是否存在,并使用Object.prototype.propertyIsEnumerable()来检查其可枚举性。此外,与Symbols不同,非可枚举的属性在使用Object.getOwnPropertyNames()时会显示出来。