Object.keys 与 Object.getOwnPropertyNames() 有何区别【热度: 210】

Object.keys()Object.getOwnPropertyNames()都是用于获取对象自身属性名的方法,但它们之间存在一些区别:

一、返回值类型

  1. Object.keys()

    • 返回一个由对象自身可枚举属性名组成的数组。
    • 可枚举属性是指那些可以通过for...in循环遍历到的属性。
  2. Object.getOwnPropertyNames()

    • 返回一个由对象自身所有属性名组成的数组,无论属性是否可枚举。

二、可枚举性处理

  1. Object.keys()

    • 只返回可枚举属性的名称。如果一个属性被设置为不可枚举,它将不会出现在Object.keys()的返回结果中。
    • 例如,使用Object.defineProperty()定义的不可枚举属性不会被包含在Object.keys()的结果中。
  2. Object.getOwnPropertyNames()

    • 返回所有属性的名称,包括可枚举和不可枚举的属性。
    • 这使得它在需要获取对象的所有属性,无论其可枚举性如何时非常有用。

三、示例

  1. 以下是一个使用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()只返回了可枚举的属性property1property2,而Object.getOwnPropertyNames()返回了所有属性,包括不可枚举的nonEnumerableProperty