Reflect.ownKeys 和 Object.keys的区别

2 阅读1分钟

起因

最近在翻vue源码的时候看到一段代码

  const keys = hasSymbol
    ? Reflect.ownKeys(from)
    : Object.keys(from)

所以有了标题

Reflect.ownKeys

Reflect.ownKeys() 方法是在 ES6 中引入的,它返回一个由目标对象自身的所有键组成的数组。这包括了字符串类型的键和 Symbol 类型的键,无论它们是否可枚举。

下面给出例子:

const object = {
  prop1: 'value1',
  [Symbol('prop2')]: 'value2'
};
Object.defineProperty(object, 'prop3', {
  value: 'value3',
  enumerable: false
});

console.log(Reflect.ownKeys(object));
// 输出: ["prop1", "prop3", Symbol(prop2)]

Object.keys

Object.keys() 方法是在较早的 ES5 规范中引入的,它返回一个包含对象自身的所有可枚举属性的字符串键的数组。

同样例子输出:

const object = {
  prop1: 'value1',
  [Symbol('prop2')]: 'value2'
};
Object.defineProperty(object, 'prop3', {
  value: 'value3',
  enumerable: false
});

console.log(Reflect.Object(object));
// 输出: ["prop1" ]

总结

  • Reflect.ownKeys() 返回对象所有自身的键,包括字符串键和 Symbol 键,而不考虑它们是否可枚举。
  • Object.keys() 只返回对象自身的可枚举属性的字符串键。

这两个方法在处理对象属性时各有用处。Reflect.ownKeys() 更全面,适合需要获取对象所有键的场合。而 Object.keys() 更适用于只关心可枚举属性的场合。