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()
时会显示出来。