¿Cuál es la diferencia entre Object.getOwnPropertyNamesy Object.keysen 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: falseestos 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
lengthpropiedades de los objetos de matriz no son enumerables, por lo que no se muestran enObject.keys.lengthpropiedad de los objetos está en el prototipo, no en el objeto en sí, por lo queObject.keysniObject.getOwnPropertyNameslo enumerará.Object.getOwnPropertyNames(anyArray)incluyelengthObject.getOwnPropertyNames(anyArray)de hecho incluyelengthen la matriz devuelta!Otra diferencia es en caso de que el
Object.getOwnPropertyNamesmé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
foofunció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.getOwnPropertyNamesdevolverá los nombres de propiedad paracat1y nocat2. Las dos formas de crear el objeto no producen una diferencia entreObject.getOwnPropertyNamesyObject.keys.Como ya se explicó,
.keysno devuelve propiedades enumerables.En cuanto a los ejemplos, uno de los casos de dificultades es un
Errorobjeto: 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
getOwnPropertyNamesno estar en orden? Porque ES2015 especifica un pedido paraObect.getOwnPropertyNames, mientras que el pedidoObect.keysaú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.