在本教程中,您将了解 JavaScript 对象的可枚举属性。

JavaScript 可枚举属性介绍

使用 for...in 循环或 Objects.keys() 方法迭代 JavaScript 对象的可枚举属性。

在 JavaScript ,对象是键值对的无序列表。键通常是一个字符串或一个符号。值可以是任何基本类型包括字符串、布尔值、数字、未定义或空值、对象或函数

以下示例使用对象字面量语法创建一个新对象:

const person = {
    firstName: 'John',
    lastName: 'Doe
};

person 对象有两个属性:firstNamelastName

一个对象属性有几个内部属性,包括 valuewritableenumerableconfigurable。更多关于对象属性的详细信息,请阅读对象属性

当使用 for...in 循环或 Object.keys() 方法枚举对象的属性时,数据属性 enumerable 确定对象属性是否可访问。

默认情况下,所有通过简单赋值或通过属性初始化器创建的属性都是可枚举的。例如:

const person = {
    firstName: 'John',
    lastName: 'Doe'
};

person.age = 25;

for (const key in person) {
    console.log(key);
}

输出:

firstName
lastName
age

在这个例子中:

  • firstNamelastName 是可枚举属性,因为它们是通过属性初始化器创建的。
  • age 属性也是可枚举的,因为它是通过简单的赋值创建的。

要修改属性的数据属性 enumerable,您可以使用 Object.defineProperty() 方法。例如:

const person = {
    firstName: 'John',
    lastName: 'Doe'
};

person.age = 25;

Object.defineProperty(person, 'ssn', {
    enumerable: false,
    value: '123-456-7890'
});

for (const key in person) {
    console.log(key);
}

输出:

firstName
lastName
age

在此示例中,创建 ssn 属性时将 enumerable 设置为 false,因此它不会出现在for...in 循环中。

ES6 提供 propertyIsEnumerable() 方法来确定属性是否可枚举。如果属性是可枚举的,它返回true,否则false。例如:

const person = {
    firstName: 'John',
    lastName: 'Doe'
};

person.age = 25;

Object.defineProperty(person, 'ssn', {
    enumerable: false,
    value: '123-456-7890'
});


console.log(person.propertyIsEnumerable('firstName')); // => true
console.log(person.propertyIsEnumerable('lastName')); // => true
console.log(person.propertyIsEnumerable('age')); // => true
console.log(person.propertyIsEnumerable('ssn')); // => false

结论

  • 如果一个属性的数据属性 enumerable 设置为 true,则属性是可枚举的。obj.propertyIsEnumerable() 确定属性是否可枚举。
  • 通过简单赋值或属性初始化器创建的属性是可枚举的。