致命JS:如何在Reflect.ownKeys()和Object.keys()之间进行选择?转载本文请联系前端思维框架公众号。今天在写一段深拷贝代码的时候,想到了一个问题:JavaScript中如何遍历Object的Keys,遇到了Reflect.ownKeys(obj)和Object.keys(obj)这两个方法。它们之间有什么区别?我们先来看一个例子:constobj={a:5,b:5};console.log(Reflect.ownKeys(obj));console.log(Object.keys(obj));//Result//['a','b']//['a','b']好像没什么区别。去查看这两个方法的文档,发现:Object.keys(obj)返回结果为:给定的对象本身可以是一个由枚举属性组成的数组,属性名在数组中的排列顺序与顺序相同当对象正常循环时返回。Reflect.ownKeys(obj)的返回结果等同于:Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))Object.getOwnPropertyNames()方法返回指定对象的所有自身属性的属性名(包括不可枚举属性的数组,但不包括以Symbol值作为名称的属性)。Object.getOwnPropertySymbols()方法返回给定对象拥有的所有符号属性的数组。Reflect.ownKeys(obj)相当于将给定对象的所有属性作为数组返回。我们通过下面的代码看看两者的区别:vartestObject={[Symbol('1')]:1,a:2};Object.defineProperty(testObject,'myMethod',{value:function(){alert("Nonenumerableproperty");},enumerable:false});console.log(Object.keys(testObject));//['a']console.log(Reflect.ownKeys(testObject));//['a','myMethod',Symbol(1)]总结Object.keys(obj):结果是对象上所有可枚举的键;Reflect.ownKeys(obj):结果是所有键。
