Perf também é uma razão. Às vezes, você pode precisar fazer um loop sobre as teclas. Existem várias maneiras de fazer isso
for (let key in object) { ... }
for (let key in object) { if (object.hasOwnProperty(key) { ... } }
for (let key of Object.keys(object)) { ... }
Eu costumo usar for of Object.keys()
como ele faz a coisa certa e é relativamente concisa, não há necessidade de adicionar a verificação.
Mas, é muito mais lento .
Apenas supor que o motivo Object.keys
é lento é óbvio, Object.keys()
tem que fazer uma alocação. De fato, o AFAIK precisa alocar uma cópia de todas as chaves desde então.
const before = Object.keys(object);
object.newProp = true;
const after = Object.keys(object);
before.join('') !== after.join('')
É possível que o mecanismo JS possa usar algum tipo de estrutura de chave imutável, para que Object.keys(object)
retorne uma referência que itere sobre chaves imutáveis e que object.newProp
crie um objeto de chaves imutáveis totalmente novo, mas seja o que for, é claramente mais lento em até 15x
Até a verificação hasOwnProperty
é até 2x mais lenta.
O ponto de tudo isso é que, se você tiver um código sensível ao desempenho e precisar fazer um loop sobre as chaves, poderá usar for in
sem precisar chamar hasOwnProperty
. Você só pode fazer isso se não tiver modificadoObject.prototype
observe que se você Object.defineProperty
modificar o protótipo se as coisas adicionadas não forem enumeráveis, elas não afetarão o comportamento do JavaScript nos casos acima. Infelizmente, pelo menos no Chrome 83, eles afetam o desempenho.
Adicionei 3000 propriedades não enumeráveis apenas para tentar forçar a exibição de quaisquer problemas de perf. Com apenas 30 propriedades, os testes foram muito próximos para dizer se houve algum impacto no desempenho.
https://jsperf.com/does-adding-non-enumerable-properties-affect-perf
O Firefox 77 e o Safari 13.1 não mostraram diferença no perf entre as classes Augmented e Unaugmented. Talvez a v8 seja corrigida nessa área e você possa ignorar os problemas de perf.
Mas deixe-me acrescentar que há a história deArray.prototype.smoosh
. A versão curta é a Mootools, uma biblioteca popular, criada por eles mesmos Array.prototype.flatten
. Quando o comitê de padrões tentou adicionar um nativo, Array.prototype.flatten
eles encontraram o impossível sem quebrar muitos sites. Os desenvolvedores que descobriram sobre o intervalo sugeriram nomear o método es5 smoosh
como uma piada, mas as pessoas se assustaram ao não entender que era uma piada. Eles se estabeleceram em flat
vez deflatten
A moral da história é que você não deve estender objetos nativos. Caso contrário, você poderá encontrar o mesmo problema de quebra de suas coisas e, a menos que sua biblioteca em particular seja tão popular quanto o MooTools, é improvável que os fornecedores de navegadores contornem o problema que você causou. Se a sua biblioteca ficar tão popular, seria meio que forçar todo mundo a solucionar o problema que você causou. Portanto, não estenda objetos nativos