Object.keys()和Object.getOwnPropertyNames()都是用于获取对象自身属性名的方法,但它们之间存在一些区别:
一、返回值类型
-
Object.keys():- 返回一个由对象自身可枚举属性名组成的数组。
- 可枚举属性是指那些可以通过
for...in循环遍历到的属性。
-
Object.getOwnPropertyNames():- 返回一个由对象自身所有属性名组成的数组,无论属性是否可枚举。
二、可枚举性处理
-
Object.keys():- 只返回可枚举属性的名称。如果一个属性被设置为不可枚举,它将不会出现在
Object.keys()的返回结果中。 - 例如,使用
Object.defineProperty()定义的不可枚举属性不会被包含在Object.keys()的结果中。
- 只返回可枚举属性的名称。如果一个属性被设置为不可枚举,它将不会出现在
-
Object.getOwnPropertyNames():- 返回所有属性的名称,包括可枚举和不可枚举的属性。
- 这使得它在需要获取对象的所有属性,无论其可枚举性如何时非常有用。
三、示例
- 以下是一个使用
Object.keys()和Object.getOwnPropertyNames()的示例:
const obj = {
property1: "value1",
property2: "value2",
};
Object.defineProperty(obj, "nonEnumerableProperty", {
value: "value3",
enumerable: false,
});
console.log(Object.keys(obj)); // ['property1', 'property2']
console.log(Object.getOwnPropertyNames(obj)); // ['property1', 'property2', 'nonEnumerableProperty']在这个例子中,Object.keys()只返回了可枚举的属性property1和property2,而Object.getOwnPropertyNames()返回了所有属性,包括不可枚举的nonEnumerableProperty。