JavaScript 实现对象长度的获取
在 JavaScript 中,要获取对象的长度(即对象中属性的数量),可以使用以下几种方法:
- 使用
Object.keys()
:该方法返回一个对象自身(即不包括继承属性)可枚举属性的数组。 - 使用
Object.getOwnPropertyNames()
:该方法返回一个对象自身(即不包括继承属性)所有属性的数组(包括不可枚举属性,但不包括 Symbol 属性)。 - 使用
Reflect.ownKeys()
:该方法返回一个对象自身(即不包括继承属性)所有属性的数组(包括不可枚举属性和 Symbol 属性)。 - 使用
for...in
: 该方法依次访问一个对象及其原型链中所有可枚举的属性。
以下是每种方法的示例代码:
使用 Object.keys()
const x = {f: 6,
};const obj = Object.create(x);
obj.a = 1;
obj.b = 2;
obj.c = 3;Object.defineProperty(obj, "d", {value: 4,enumerable: false,
});const symbolKey = Symbol("e");
obj[symbolKey] = 5;const length = Object.keys(obj).length;
console.log(length); // 输出 3
说明:
Object.keys()
只计算对象自身(即不包括继承属性)的可枚举属性。- 添加了一个继承属性
f
、一个不可枚举属性d
和一个 Symbol 属性symbolKey
。 - 输出对象
obj
的长度为 3。
使用 Object.getOwnPropertyNames()
const x = {f: 6,
};const obj = Object.create(x);
obj.a = 1;
obj.b = 2;
obj.c = 3;Object.defineProperty(obj, "d", {value: 4,enumerable: false,
});const symbolKey = Symbol("e");
obj[symbolKey] = 5;const length = Object.getOwnPropertyNames(obj).length;
console.log(length); // 输出 4
说明:
Object.getOwnPropertyNames()
计算对象自身(即不包括继承属性)的所有属性,包括不可枚举属性(除了 Symbol 属性)。- 添加了一个继承属性
f
、一个不可枚举属性d
和一个 Symbol 属性symbolKey
。 - 输出对象
obj
的长度为 4。
使用 Reflect.ownKeys()
const x = {f: 6,
};const obj = Object.create(x);
obj.a = 1;
obj.b = 2;
obj.c = 3;Object.defineProperty(obj, "d", {value: 4,enumerable: false,
});const symbolKey = Symbol("e");
obj[symbolKey] = 5;const length = Reflect.ownKeys(obj).length;
console.log(length); // 输出 5
说明:
Reflect.ownKeys()
计算对象自身的(即不包括继承属性)所有属性,包括不可枚举属性和 Symbol 属性。- 添加了一个继承属性
f
、一个不可枚举属性d
和一个 Symbol 属性symbolKey
。 - 输出对象
obj
的长度为 5。
使用 for...in
语句
const x = {f: 6,
};const obj = Object.create(x);
obj.a = 1;
obj.b = 2;
obj.c = 3;Object.defineProperty(obj, "d", {value: 4,enumerable: false,
});const symbolKey = Symbol("e");
obj[symbolKey] = 5;let count = 0,count_all = 0;
for (let key in obj) {if (obj.hasOwnProperty(key)) {count++;}count_all++;
}
console.log(count); // 3
console.log(count_all); // 4
说明:
- 使用
for...in
循环遍历对象的属性并计数的方法来获取对象的长度,可计算自有属性和继承属性,但不包括不可枚举属性和 Symbol 属性。 - 添加了一个继承属性
f
、一个不可枚举属性d
和一个 Symbol 属性symbolKey
。
通过上述方法,可以根据不同需求,选择合适的方法来获取对象的长度。