当前位置:  开发笔记 > 编程语言 > 正文

Reflect.ownKeys(obj)和Object.keys(obj)有什么区别?

如何解决《Reflect.ownKeys(obj)和Object.keys(obj)有什么区别?》经验,为你挑选了3个好方法。

在一个真实的简单案例中测试它们会产生相同的输出:

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)



1> BatScream..:

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证明.


有这个用吗?
它也是键和符号之间的重要区别,它可能需要也可能不需要枚举为两个不同的东西

2> Josh Durham..:

首先,一个例子(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()的一个特征).



3> GOTO 0..:

Object.keys只返回可枚举的字符串键; Reflect.ownKeys无论其可枚举性如何,都返回字符串和符号键.两者都仅在自己的属性上运行.

Object.keys如果参数不是对象而不是nullundefined(例如Object.keys(1)),则返回一个空数组,而Reflect.ownKeys抛出a TypeError.

Reflect.ownKeys 是在ES6中引入的,旧的JavaScript引擎不支持.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有