2011-06-09 15 views
6

Finalmente he tenido la curiosidad de descubrir por qué JavaScript hace su magia vudú para saber por qué no todas las referencias de objetos se crean iguales.¿Por qué funciona esto? Referencias de objetos en Javascript

dado el ejemplo:

var a, b, c, d; 
a = 100; b = a; 

c = {}; d = c; 

b = 10; d.e = 'f'; 

console.log(a, b); // outputs 100, 10 
console.log(c, d); // outputs object => e = 'f', object => e = 'f' 

Si todas las variables en JavaScript son objetos, a continuación, lo que hace que el caso de uso con c y d fundido explícitamente como un Object tan diferente de la definición a y b como Number? O bien, ¿por qué se vincularán c y d, y no a y b?

Respuesta

8

Todas las variables en JavaScript no son objetos. También hay tipos nativos.

c y d son no vinculadas entre sí. Están apuntando a la misma referencia de objeto. Si tuviera que reasignar d a otra cosa, no afectará a c.

var c = {}; 
var d = c; 
d = { foo: "bar" }; 

c === d // false 

Sin embargo, si se va a modificar el objeto que está siendo referenciado por c o d, se modificará el mismo objeto desde c y d están referidos ambos al mismo objeto como en su ejemplo.

+0

Eso tiene MUCHO más sentido al verlo así. ¡Gracias! – buzzedword

3

A mi me parece que la diferencia es con b, eres reasignar la variable a un nuevo objeto/valor, mientras que con d, estás modificar el objeto existente.

+0

Así que lo que está diciendo, entonces, es que (como se señaló Anurag) utilizando un tipo nativo implícitamente crear un objeto 'new', mientras que el objeto reasignar a otra variable, simplemente hace una reference-- a menos que el La palabra clave 'new' se usa explícitamente? – buzzedword

+0

Esto no es estrictamente correcto. Los valores asignados a 'a' y' b' son * no * objetos. – lawnsea

+0

@Buzzedword: Algo así. – JAB

2

El valor de a que está asignado a b es un Número. El valor asignado de c a d es una referencia a un objeto.

var a, b, c, d; 
a = 100; // a has value 100, a number 
b = a; // b has value 100, a number 

c = {}; // c has value p, a reference to some object P 
d = c; // d has value p, a reference to P 

b = 10; // b has value 10, a number 
d.e = 'f'; // P.e has value 'f', a string 
Cuestiones relacionadas