Perf è anche un motivo. A volte potresti dover ricorrere ai tasti. Esistono diversi modi per farlo
for (let key in object) { ... }
for (let key in object) { if (object.hasOwnProperty(key) { ... } }
for (let key of Object.keys(object)) { ... }
Di solito uso for of Object.keys()
come fa la cosa giusta ed è relativamente conciso, non è necessario aggiungere il controllo.
Ma è molto più lento .
Indovinare il motivo Object.keys
è lento è ovvio, Object.keys()
deve fare un'allocazione. Infatti, AFAIK deve allocare una copia di tutte le chiavi da allora.
const before = Object.keys(object);
object.newProp = true;
const after = Object.keys(object);
before.join('') !== after.join('')
È possibile che il motore JS possa utilizzare una sorta di struttura di chiavi immutabile in modo che Object.keys(object)
restituisca un riferimento qualcosa che scorre su chiavi immutabili e che object.newProp
crea un oggetto chiavi immutabile completamente nuovo ma, qualunque cosa, è chiaramente più lento fino a 15 volte
Anche il controllo hasOwnProperty
è fino a 2 volte più lento.
Il punto di tutto ciò è che se si dispone di un codice sensibile al perf e è necessario eseguire il loop over dei tasti, si desidera essere in grado di utilizzare for in
senza dover chiamare hasOwnProperty
. Puoi farlo solo se non hai modificatoObject.prototype
nota che se usi Object.defineProperty
per modificare il prototipo se le cose che aggiungi non sono enumerabili, non influenzeranno il comportamento di JavaScript nei casi precedenti. Sfortunatamente, almeno in Chrome 83, influiscono sulle prestazioni.
Ho aggiunto 3000 proprietà non enumerabili solo per provare a forzare la comparsa di eventuali problemi perf. Con solo 30 proprietà i test erano troppo vicini per dire se ci fosse un impatto perfetto.
https://jsperf.com/does-adding-non-enumerable-properties-affect-perf
Firefox 77 e Safari 13.1 non hanno mostrato alcuna differenza in perf tra le classi Aumentata e Non aumentata, forse v8 verrà risolto in quest'area e puoi ignorare i problemi di perf.
Ma, lasciatemi aggiungere anche che c'è la storia diArray.prototype.smoosh
. La versione breve è Mootools, una biblioteca popolare, fatta propria Array.prototype.flatten
. Quando il comitato per gli standard ha tentato di aggiungere un nativo Array.prototype.flatten
, ha scoperto che non poteva senza rompere molti siti. Gli sviluppatori che hanno scoperto la pausa hanno suggerito di nominare il metodo es5 smoosh
come uno scherzo, ma la gente ha dato di matto non capendo che era uno scherzo. Si stabilirono flat
invece diflatten
La morale della storia è che non dovresti estendere gli oggetti nativi. Se lo fai, potresti imbatterti nello stesso problema della tua interruzione e, a meno che la tua particolare libreria non sia così popolare come MooTools, è improbabile che i fornitori di browser risolvano il problema che hai causato. Se la tua libreria diventa così popolare, sarebbe un po 'meschino costringere tutti gli altri a risolvere il problema che hai causato. Quindi, per favore non estendere gli oggetti nativi