本词条介绍 枚举对象的属性 的方法,不同方法有不同特点,例如是否只包含可枚举属性、是否包含继承来的属性、是否包含 Symbol 等。
| 方法 | 枚举 | 继承 | 键的类型 |
|---|---|---|---|
for...in 循环 |
仅可枚举属性 | 包含继承来的属性 | 只包含字符串键属性 |
Object.keys, Object.values 和 Object.entries |
仅可枚举属性 | 仅自有属性 | 只包含字符串键属性 |
Object.getOwnPropertyNames() |
包括不可枚举属性 | 仅自有属性 | 只包含字符串键属性 |
Object.getOwnPropertySymbols() |
包括不可枚举属性 | 仅自有属性 | 只包含 Symbol 键属性 |
Reflect.ownKeys() |
包括不可枚举属性 | 仅自有属性 | 包含字符串键属性和 Symbol 键属性 |
属性的可枚举性
对象的属性有一个内部特性 [[Enumerable]],它决定了该属性是否可以被枚举。默认情况下,通过对象字面量或 Object.defineProperty 方法创建的属性是可枚举的,除非显式地将 enumerable 设置为 false。
for...in 循环
for...in 语句迭代一个对象的所有可枚举字符串属性(除 Symbol 以外),包括继承的可枚举属性。
const object = { a: 1, b: 2, c: 3 };
for (const property in object) {
console.log(`${property}: ${object[property]}`);
}
// Expected output:
// "a: 1"
// "b: 2"
// "c: 3"
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/for...in
Object.keys, Object.values 和 Object.entries
Object.keys()静态方法返回一个由给定对象自身的可枚举的字符串键属性名组成的数组。Object.values()静态方法返回一个给定对象的自有可枚举字符串键属性值组成的数组。Object.entries()静态方法返回一个数组,包含给定对象自有的可枚举字符串键属性的键值对。
const object1 = {
a: 'somestring',
b: 42,
c: false,
};
console.log(Object.keys(object1));
// Expected output: Array ["a", "b", "c"]
console.log(Object.values(object1));
// Expected output: Array ["somestring", 42, false]
for (const [key, value] of Object.entries(object1)) {
console.log(`${key}: ${value}`);
}
// Expected output:
// "a: somestring"
// "b: 42"
// "c: false"
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/values
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/entries
Object.getOwnPropertyNames() 和 Object.getOwnPropertySymbols()
Object.getOwnPropertyNames()静态方法返回一个数组,其包含给定对象中所有自有属性(包括不可枚举属性,但不包括使用 symbol 值作为名称的属性)。Object.getOwnPropertySymbols()静态方法返回一个包含给定对象所有自有 Symbol 属性的数组。
const object1 = {
a: 1,
b: 2,
c: 3,
};
console.log(Object.getOwnPropertyNames(object1));
// Expected output: Array ["a", "b", "c"]
const object1 = {};
const a = Symbol('a');
const b = Symbol.for('b');
object1[a] = 'localSymbol';
object1[b] = 'globalSymbol';
const objectSymbols = Object.getOwnPropertySymbols(object1);
console.log(objectSymbols);
// Expected output: Array [Symbol(a), Symbol(b)]
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertySymbols
Reflect.ownKeys()
静态方法 Reflect.ownKeys() 返回一个由目标对象自身的属性键组成的数组。
它的返回值等同于 Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))。
const object1 = {
property1: 42,
property2: 13,
};
const array1 = [];
console.log(Reflect.ownKeys(object1));
// Expected output: Array ["property1", "property2"]
console.log(Reflect.ownKeys(array1));
// Expected output: Array ["length"]
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect/ownKeys