在一个真实的简单案例中测试它们会产生相同的输出:
const obj = {a: 5, b: 5}; console.log(Reflect.ownKeys(obj)); console.log(Object.keys(obj)); // Result ['a', 'b'] ['a', 'b']
什么时候Reflect.ownKeys(obj)
产生的输出不同Object.keys(obj)
?
Object.keys()
返回一个array
字符串,它是对象自己的可枚举属性.
Reflect.ownKeys(obj)
返回相当于:
Object.getOwnPropertyNames(target). concat(Object.getOwnPropertySymbols(target))
该Object.getOwnPropertyNames()
方法返回直接在给定对象上找到的所有属性(或不属性)的数组.enumerable
该Object.getOwnPropertySymbols()
方法返回symbol
直接在给定对象上找到的所有属性的数组.
var testObject; Object.defineProperty(testObject, 'myMethod', { value: function () { alert("Non enumerable property"); }, enumerable: false }); //does not print myMethod since it is defined to be non-enumerable console.log(Object.keys(testObject)); //prints myMethod irrespective of it being enumerable or not. console.log(Reflect.ownKeys(testObject));
小小的fiddle
证明.
首先,一个例子(ES6Fiddle):
// getFoo is property which isn't enumerable var my_obj = Object.create({}, { getFoo: { value: function() { return this.foo; } } }); my_obj.foo = 1; console.log(Object.keys(my_obj)); // console ['foo'] console.log(Reflect.ownKeys(my_obj)); // console ['getFoo', 'foo']
这里,Reflect.ownKeys()
返回目标对象自己的属性键的数组.即,直接在给定对象上找到的所有属性(可枚举或不可枚举)的数组与直接在给定对象上找到的所有符号属性的数组连接.
Object.ownKeys()
只会返回可枚举的属性.
可枚举属性是可以通过for ... in循环枚举的属性,但通过原型链继承的属性除外.有关更多详细信息,请参阅MDN说明.
摘要:
Reflect.ownKeys()等效于Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))
返回可枚举和不可枚举的属性
而
Object.keys()返回可枚举属性,但不返回非可枚举属性(这是Object.getOwnPropertyNames()的一个特征).
Object.keys
只返回可枚举的字符串键; Reflect.ownKeys
无论其可枚举性如何,都返回字符串和符号键.两者都仅在自己的属性上运行.
Object.keys
如果参数不是对象而不是null
或undefined
(例如Object.keys(1)
),则返回一个空数组,而Reflect.ownKeys
抛出a TypeError
.
Reflect.ownKeys
是在ES6中引入的,旧的JavaScript引擎不支持.