¿Cuál es la diferencia entre Object.getOwnPropertyNames
y Object.keys
en JavaScript? También se agradecerían algunos ejemplos.
javascript
kamilkp
fuente
fuente
Object.keys()
no las devuelve, mientras queObject.getOwnPropertyNames()
sí.Respuestas:
Hay una pequeña diferencia
Object.getOwnPropertyNames(a)
devuelve todas las propiedades propias del objetoa
.Object.keys(a)
devuelve todas las propiedades propias enumerables . Significa que si define las propiedades de su objeto sin hacer algunas de ellas,enumerable: false
estos dos métodos le darán el mismo resultado.Es fácil de probar:
Si define una propiedad sin proporcionar un descriptor de atributos de propiedad (lo que significa que no usa
Object.defineProperties
), por ejemplo:entonces dicha propiedad se convierte automáticamente en enumerable y ambos métodos producen la misma matriz.
fuente
length
propiedades de los objetos de matriz no son enumerables, por lo que no se muestran enObject.keys
.length
propiedad de los objetos está en el prototipo, no en el objeto en sí, por lo queObject.keys
niObject.getOwnPropertyNames
lo enumerará.Object.getOwnPropertyNames(anyArray)
incluyelength
Object.getOwnPropertyNames(anyArray)
de hecho incluyelength
en la matriz devuelta!Otra diferencia es en caso de que el
Object.getOwnPropertyNames
método de matriz devuelva una propiedad adicional que eslength
.fuente
Notación literal vs constructor al crear objeto. Aquí hay algo que me atrapó.
Entonces, en mi caso, la
foo
función no funcionó si le di objetos del tipo cat2.Hay otras formas de crear objetos, por lo que también podría haber otros problemas.
fuente
Object.getOwnPropertyNames
devolverá los nombres de propiedad paracat1
y nocat2
. Las dos formas de crear el objeto no producen una diferencia entreObject.getOwnPropertyNames
yObject.keys
.Como ya se explicó,
.keys
no devuelve propiedades enumerables.En cuanto a los ejemplos, uno de los casos de dificultades es un
Error
objeto: algunas de sus propiedades son enumerables.Entonces, mientras
console.log(Object.keys(new Error('some msg')))
rinde[]
,console.log(Object.getOwnPropertyNames(new Error('some msg')))
rinde["stack", "message"]
fuente
Otra diferencia es que (al menos con nodejs) la función "getOwnPropertyNames" no garantiza el orden de las claves, es por eso que generalmente uso la función "claves":
fuente
getOwnPropertyNames
no estar en orden? Porque ES2015 especifica un pedido paraObect.getOwnPropertyNames
, mientras que el pedidoObect.keys
aún depende de la implementación.for-in loop
,Object.keys
, yObject.getOwnPropertyNames
. Dicho esto, los tres se enumerarán en un orden consistente uno con respecto al otro.