Object.getOwnPropertyNames与Object.keys

Object.getOwnPropertyNamesObject.keys在JavaScript中有什么区别? 还有一些例子,将不胜感激。

有一点区别。 Object.getOwnPropertyNames(a)返回对象a 所有属性。 Object.keys(a)返回所有可枚举的属性。 这意味着如果你定义你的对象属性而不使它们中的一些enumerable: false这两个方法会给你相同的结果。

这很容易testing:

 var a = {}; Object.defineProperties(a, { one: {enumerable: true, value: 'one'}, two: {enumerable: false, value: 'two'}, }); Object.keys(a); // ["one"] Object.getOwnPropertyNames(a); // ["one", "two"] 

如果你定义一个属性而不提供属性属性描述符(意思是你不使用Object.defineProperties ),例如:

 a.test = 21; 

那么这样的属性将自动成为一个枚举,并且这两个方法产生相同的数组。

另一个区别是在数组Object.getOwnPropertyNames返回一个额外的属性是lenth

 var x = ["a", "b", "c", "d"]; Object.keys(x); //[ '0', '1', '2', '3' ] Object.getOwnPropertyNames(x); //[ '0', '1', '2', '3', 'length' ] 

另一个区别是(至less与nodejs)“getOwnPropertyNames”函数不能保证键的顺序,这就是为什么我通常使用“键”function:

  Object.keys(o).forEach(function(k) { if (!o.propertyIsEnumerable(k)) return; // do something... });