起因
最近在翻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()
更适用于只关心可枚举属性的场合。