Mi stavo confondendo un po 'con un esperimento mentale e ora sto cercando qualche consiglio. Si tratta di riferimenti ECMAscript e del metodo Array.prototype.indexOf()
.Come risolve i riferimenti indexOf() di Javascript
Iniziamo facile:
var container = [ ];
// more code
container.push(5);
container.push(7);
container.push(10);
Così ora abbiamo spinto alcuni "valori primitivi" nella nostra gamma ECMAscript (anche questa affermazione è vera Tornerò per), a Almeno l'ho immaginato così fino ad ora. Una chiamata a
container.indexOf(7);
tornerà 1
come previsto. La grande domanda che ho è, se .indexOf()
confronta davvero il valore primitivo o se in realtà un oggetto Number()
viene creato + memorizzato e il suo riferimento viene confrontato. Questo diventa un po 'più evidente se si ri-scrittura che in questo modo:
var a = 5,
b = 7,
c = 10;
var container = [ ];
container.push(a);
container.push(b);
container.push(c);
container.indexOf(b);
Fino a questo punto, si potrebbe ancora facilmente obiettare che tutti i .indexOf()
deve fare è quello di confrontare i valori, ma ora consente di guardare qualcosa di simile:
var a = { name: 'a', value: 5 },
b = { name: 'b', value: 10 },
c = { name: 'c', value: 15 };
var container = [ ];
// more code
container.push(a);
container.push(b);
container.push(c);
Qui, abbiamo riempito tale matrice contenitore con oggettuali riferimenti ed ancora, .indexOf()
opere come previsto
container.indexOf(b) // === 1
durante una chiamata del genere
container.indexOf({ name: 'b', value: 10 });
ritorna ovviamente -1
poiché stiamo creando un nuovo oggetto e ottenere un nuovo riferimento. Quindi qui deve confrontare internamente i riferimenti tra loro, giusto?
Qualche genio delle specifiche ECMAscript può confermarmi o, meglio ancora, collegarmi un po 'di materiale a riguardo?
Una domanda laterale su questo sarebbe se non v'è alcun modo possibilmente per accedere a un oggetto riferimento memorizzato internamente di un lexicalEnvironment rispettivamente attivazione oggetto.
Se funziona ovunque simile ad altre lingue, quindi 'indexOf' funziona su hash di oggetti in cui gli oggetti di solito hanno valori diversi e oggetti primitivi di solito hanno un hash costante basata su il loro valore (per interi, questo è molto spesso solo il valore intero stesso). Quindi due oggetti int "5" e "5" hanno entrambi l'hash "5" e in quanto tali sono "uguali". – poke
Ho iniziato a scrivere una risposta, ma poi si è trasformato in un post sul blog, così mi sono fermato e mi sono scoraggiato dal riscriverlo. Ma se sei interessato: http://pastie.org/4828933 – Zirak