Javascript 通过引用传递对象。这是完全有道理的。但是一旦你开始操纵这些对象,一切都会以一种看起来不直观的方式运作。让我举个例子:
var a, b;
a = {}
b = a;
a['one'] = {};
console.log( JSON.stringify(a) );
// outputs: {"one":{}}
console.log( JSON.stringify(b) );
// outputs: {"one":{}}
这一切都很好,因为现在b
有一个指向a
所以预计将东西分配给a
也会影响b
.
但如果我这样做:
a = a['one'];
console.log( JSON.stringify(a) );
// outputs: {}
console.log( JSON.stringify(b) );
// outputs: {"one":{}}
这让我感到惊讶。我预计a
and b
仍然是一样的(并且是{}
since a['one']
之前设置为{}
and a
被设置为a['one']
).
但事实并非如此。看起来a
失去了对b
当它被分配给新事物时,但是b
维持以下价值a
被设置为之前a
失去其参考b
.
但如果我这样做:
a['two'] = 2;
console.log( JSON.stringify(a) );
// outputs: {"two":2}
console.log( JSON.stringify(b) );
// outputs: {"one":{"two":2}}
What? a
显然已经失去了它的参考b
, but b
看来还是有一定参考意义的a
.
是否为空对象{}
指向内存中的某个位置,因此引用它的每个变量现在都指向同一个位置?
有对此有深入了解的人可以给我解释一下吗?