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
。