Perf también es una razón. A veces es posible que deba recorrer las teclas. Hay varias formas de hacer esto
for (let key in object) { ... }
for (let key in object) { if (object.hasOwnProperty(key) { ... } }
for (let key of Object.keys(object)) { ... }
Usualmente lo uso for of Object.keys()
porque hace lo correcto y es relativamente breve, no es necesario agregar el cheque.
Pero es mucho más lento .
Solo adivinar que la razón Object.keys
es lenta es obvio, Object.keys()
tiene que hacer una asignación. De hecho, AFAIK tiene que asignar una copia de todas las claves desde entonces.
const before = Object.keys(object);
object.newProp = true;
const after = Object.keys(object);
before.join('') !== after.join('')
Es posible que el motor JS pueda usar algún tipo de estructura de clave inmutable para que Object.keys(object)
devuelva una referencia que repita algo sobre las claves inmutables y que object.newProp
cree un objeto de claves inmutable completamente nuevo, pero lo que sea, es claramente más lento hasta 15x
Incluso la comprobación hasOwnProperty
es hasta 2 veces más lenta.
El punto de todo eso es que si tiene un código sensible al rendimiento y necesita recorrer las teclas, entonces desea poder usar for in
sin tener que llamar hasOwnProperty
. Solo puede hacer esto si no ha modificadoObject.prototype
tenga en cuenta que si utiliza Object.defineProperty
para modificar el prototipo si las cosas que agrega no son enumerables, no afectarán el comportamiento de JavaScript en los casos anteriores. Desafortunadamente, al menos en Chrome 83, sí afectan el rendimiento.
Agregué 3000 propiedades no enumerables solo para intentar forzar la aparición de cualquier problema de rendimiento. Con solo 30 propiedades, las pruebas fueron demasiado cercanas para determinar si hubo algún impacto en el rendimiento.
https://jsperf.com/does-adding-non-enumerable-properties-affect-perf
Firefox 77 y Safari 13.1 no mostraron diferencias en el rendimiento entre las clases aumentadas y no aumentadas, tal vez v8 se solucionará en esta área y puede ignorar los problemas de rendimiento.
Pero, permítanme agregar también que hay una historia deArray.prototype.smoosh
. La versión corta es Mootools, una biblioteca popular, hecha propia Array.prototype.flatten
. Cuando el comité de estándares trató de agregar un nativo Array.prototype.flatten
, descubrieron que no podían sin romper muchos sitios. Los desarrolladores que se enteraron del descanso sugirieron nombrar el método es5 smoosh
como una broma, pero la gente se asustó al no entender que era una broma. Se establecieron en flat
lugar deflatten
La moraleja de la historia es que no debes extender los objetos nativos. Si lo hace, podría encontrarse con el mismo problema de ruptura de sus cosas y, a menos que su biblioteca en particular sea tan popular como MooTools, es poco probable que los proveedores del navegador solucionen el problema que causó. Si su biblioteca se vuelve tan popular, sería un poco malo obligar a todos los demás a solucionar el problema que causó. Entonces, por favor no extienda los objetos nativos