2011-06-09 7 views
6

Finalmente sono stato abbastanza curioso di scoprire perché javascript fa la sua magia voodoo per imparare perché non tutti i riferimenti agli oggetti sono creati uguali.Perché funziona? Riferimenti dell'oggetto in Javascript

dato l'esempio:

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' 

Se tutte le variabili in javascript sono oggetti, quindi ciò che rende il caso d'uso con c e d getto in modo esplicito come Object in modo diverso da quello che definisce a e b come Number? Oppure, perché c e d essere collegati tra loro, e non a e b?

risposta

8

Tutte le variabili in JavaScript non sono oggetti. Ci sono anche dei tipi nativi.

c e d sono non collegati l'uno all'altro. Stanno puntando allo stesso riferimento all'oggetto. Se si dovesse riassegnare d a qualcos'altro, ciò non influirà su c.

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

c === d // false 

Tuttavia, se si dovesse modificare l'oggetto fa riferimento da c o d, si modifica lo stesso oggetto in quanto c e d sono entrambi si riferiscono allo stesso oggetto come nel tuo esempio.

+0

Questo rende molto più sensato vederlo così. Grazie! – buzzedword

3

Mi sembra che la differenza è con b, sei riassegnazione la variabile a un nuovo oggetto/valore, mentre con d, sei modificare l'oggetto esistente.

+0

Quindi quello che stai dicendo è allora, che (come ha sottolineato Anurag) utilizzando un tipo nativo sarà implicitamente creare un oggetto 'new', mentre riassegnazione l'oggetto a un'altra variabile rende semplicemente un reference-- a meno che il la parola chiave 'new' viene usata esplicitamente? – buzzedword

+0

Questo non è strettamente corretto. I valori assegnati a 'a' e' b' sono * non * oggetti. – lawnsea

+0

@Buzzedword: Qualcosa del genere. – JAB

2

Il valore di a assegnato a b è un numero. Il valore assegnato da c a d è un riferimento a un oggetto.

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 
Problemi correlati