Me estaba confundiendo un poco con un experimento mental y ahora estoy buscando algún consejo. Se trata de referencias ECMAscript y el método Array.prototype.indexOf()
.¿Cómo funciona Javascript's IndexOf() resolver referencias
deja comienzo fácil:
var container = [ ];
// more code
container.push(5);
container.push(7);
container.push(10);
Así que ahora empujamos unos "valores primitivos " en nuestra matriz de ECMAScript (ya sea o no que la afirmación es cierta Voy a volver a), por lo al menos lo imaginé así hasta ahora. Una llamada a
container.indexOf(7);
regresará 1
como se esperaba. La gran pregunta que estoy teniendo es, si .indexOf()
realmente compara el valor primitivo o si en realidad se crea 0 se almacena un objeto Number()
y se compara su referencia . Esto se convierte en un poco más evidente si se re-escribir que de este modo:
var a = 5,
b = 7,
c = 10;
var container = [ ];
container.push(a);
container.push(b);
container.push(c);
container.indexOf(b);
Hasta este punto, todavía se podría argumentar fácilmente que todos .indexOf()
tiene que hacer es comparar los valores, pero ahora veamos algo como esto:
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);
Aquí, llenamos esa matriz recipiente con objeto referencias y aún así, .indexOf()
funciona como espera
container.indexOf(b) // === 1
mientras que una llamada como ésta
container.indexOf({ name: 'b', value: 10 });
obviamente vuelve -1
ya que estamos creando un nuevo objeto y obtener una nueva referencia. Entonces aquí debe comparar internamente las referencias entre sí, ¿verdad?
¿Puede algún genio de la especificación de ECMAscript confirmar eso o incluso mejor vincularme algún material al respecto?
Una cuestión lado de esto sería si hay alguna manera de acceder posiblemente un objeto referencia almacenada internamente dentro de un lexicalEnvironment respectivamente Objeto activación.
Si esto funciona en cualquier lugar similar a otros idiomas, a continuación, 'indexOf' funciona en los hashes de objetos donde los objetos suelen tener diferentes valores y objetos primitivos por lo general tienen un hash constante basa en su valor (para enteros, esto a menudo es solo el valor entero en sí). Así que dos objetos int '5' y' 5' tienen el hash '5' y, como tales, son" lo mismo ". – poke
Empecé a escribir una respuesta, pero luego se convirtió en una publicación de blog, así que me detuve y me desanimé de volver a escribirla. Pero si está interesado: http://pastie.org/4828933 – Zirak