Object.getOwnPropertyNames vs Object.keys

Qual é a diferença entre Object.getOwnPropertyNames e Object.keys em javascript? Também alguns exemplos seriam apreciados.

Há uma pequena diferença. Object.getOwnPropertyNames(a) retorna todas as propriedades do object a . Object.keys(a) retorna todas as propriedades próprias enumeráveis . Isso significa que se você definir suas propriedades de object sem torná-las enumerable: false esses dois methods fornecerão o mesmo resultado.

É fácil de testar:

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

Se você definir uma propriedade sem fornecer um descritor de atributos de propriedade (o que significa que você não usa Object.defineProperties ), por exemplo:

 a.test = 21; 

então tal propriedade se torna um enumerável automaticamente e ambos os methods produzem o mesmo array.

Outra diferença é que no caso do método de array Object.getOwnPropertyNames retornará uma propriedade extra que é length .

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

Outra diferença é que (pelo menos com nodejs) a function “getOwnPropertyNames” não garante a ordem de chaves, é por isso que eu geralmente uso a function “keys”:

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