Object.getOwnPropertyNames与Object.keys
 Object.getOwnPropertyNames和Object.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... });