2011-06-09 60 views
6

我终于好奇地发现,为什么javascript会使用它的巫术魔法来了解为什么不是所有的对象引用都是相同的。这为什么有效? Javascript中的对象引用

给出的例子:

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' 

如果在JavaScript中的对象的所有变量,那么是什么让用例cd铸明确为Object不是定义ab作为Number如此不同?或者,为什么cd会互相链接,而不是ab

回答

8

JavaScript中的所有变量都不是对象。也有本地类型。

cd没有链接彼此。他们指向相同的对象引用。如果您要将d重新分配给其他内容,则不会影响c

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

c === d // false 

但是,如果你要修改的cd被引用的对象,它会修改同一个对象,因为cd都指的是同一个对象在你的榜样。

+0

这使得LOT更有意义。谢谢! – buzzedword 2011-06-09 16:52:45

3

在我看来两者的差异是与b,你变量重新分配给新的对象/值,同时与d,你修改现有对象

+0

所以你的意思则是,在使用本机类型将隐式地创建一个'new'对象,而重新分配对象到另一个变量只是使一个reference--除非(如阿努拉格指出) '新'关键字明确使用? – buzzedword 2011-06-09 16:46:41

+0

这不是严格正确的。分配给'a'和'b'的值是* not *对象。 – lawnsea 2011-06-09 16:46:58

+0

@Buzzedword:类似的东西。 – JAB 2011-06-09 16:47:45

2

分配给b的值a是一个数字。从cd分配的值是对对象的引用。

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