Questo è per quanto riguarda un dibattito che ho avuto con un intervistatore quando intervistavo Amazon.
Creiamo un object:
var Obj = {}; Obj['SomeProperty'] = function ( ) { console.log("Accessed some property"); }; Obj[69] = true;
C’è qualcosa nella garanzia JavaScript che quando Obj['SomeProperty']
successivamente a quelle 2 proprietà come Obj['SomeProperty']
e Obj[69]
i rispettivi valori function ( ) { console.log("Accessed some property"); };
function ( ) { console.log("Accessed some property"); };
e 69
sono guardati in tempo O (1)? So che l’operatore di accesso []
dà a un programmatore esperto l’impressione che abbia a che fare con una struttura di ricerca O (1), ma non può essere ansible per un motore JavaScript implementare Object
in modo tale che le proprietà non vengano cercate in O (1)?
C’è qualcosa nel codice JavaScript che garantisce che i valori vengano cercati nell’ora O (1)?
No. JavaScript non fornisce alcuna garanzia di complessità di alcun tipo, ad eccezione delle collezioni ES6 .
So che l’operatore di accesso
[]
dà a un programmatore esperto l’impressione che abbia a che fare con una struttura di ricerca O (1)
Sì, lo è, questa è un’aspettativa ragionevole. I motori utilizzano tutti i tipi di ottimizzazioni, dalle classi nascoste su hashmap agli array dinamici, per soddisfare questi presupposti.
Naturalmente, non dimenticare mai che gli oggetti JS sono bestie complesse e l’accesso a una semplice proprietà potrebbe innescare una trappola getter che a sua volta potrebbe fare qualsiasi cosa.
Non è ansible per un motore JavaScript implementare Object in modo tale che le proprietà non vengano cercate in O (1)?
Sì, è ansible.