Qual é a diferença entre Object.getOwnPropertyNames
e Object.keys
em javascript? Também alguns exemplos seriam apreciados.
javascript
kamilkp
fonte
fonte
Object.keys()
não as retorna, enquanto oObject.getOwnPropertyNames()
faz.Respostas:
Há uma pequena diferença.
Object.getOwnPropertyNames(a)
retorna todas as próprias propriedades do objetoa
.Object.keys(a)
retorna todos os enumeráveis propriedades próprias . Isso significa que, se você definir suas propriedades de objeto sem criar algumas delas,enumerable: false
esses dois métodos fornecerão o mesmo resultado.É fácil testar:
Se você definir uma propriedade sem fornecer o descritor de atributos de propriedade (o que significa que você não usa
Object.defineProperties
), por exemplo:então essa propriedade se torna um enumerável automaticamente e os dois métodos produzem a mesma matriz.
fonte
length
propriedades dos objetos de matriz não são enumeráveis, portanto, elas não aparecemObject.keys
.length
propriedade dos objetos está no protótipo, não no próprio objeto, portanto,Object.keys
nemObject.getOwnPropertyNames
o listará.Object.getOwnPropertyNames(anyArray)
includeslength
Object.getOwnPropertyNames(anyArray)
de fato incluilength
na matriz retornada!Outra diferença é que, no caso do
Object.getOwnPropertyNames
método array , retornará uma propriedade extralength
.fonte
Notação literal versus construtor ao criar um objeto. Aqui está algo que me pegou.
Então, no meu caso, o
foo
função não funcionaria se eu desse objetos do tipo cat2.Existem outras maneiras de criar objetos, portanto também pode haver outras distorções.
fonte
Object.getOwnPropertyNames
retornará os nomes de propriedades paracat1
e nãocat2
. As duas maneiras de criar o objeto não produzem diferença entreObject.getOwnPropertyNames
eObject.keys
.Como já foi explicado,
.keys
não retorna propriedades enumeráveis.Em relação aos exemplos, um dos casos de armadilha é um
Error
objeto: algumas de suas propriedades são enumeráveis.Então, enquanto
console.log(Object.keys(new Error('some msg')))
produz[]
,console.log(Object.getOwnPropertyNames(new Error('some msg')))
produz["stack", "message"]
fonte
Outra diferença é que (pelo menos com nodejs) a função "getOwnPropertyNames" não garante a ordem das chaves, é por isso que geralmente uso a função "keys":
fonte
getOwnPropertyNames
não estar em ordem? Porque o ES2015 especifica um pedido paraObect.getOwnPropertyNames
, enquanto o pedidoObect.keys
ainda depende da implementação.for-in loop
,Object.keys
, eObject.getOwnPropertyNames
. Dito isto, os três serão enumerados em uma ordem consistente em relação um ao outro.