3

我知道这行得通,但我不知道为什么或为什么它以这种方式工作的原因:

var foo = [5, 10];
var bar = foo;
console.log(foo); //[5, 10]
console.log(bar); //[5, 10]
bar[0] = 1; 
console.log(foo); //[1, 10]
bar = null;
console.log(foo); //[1, 10]

我预计不仅bar会变为空,而且foo也会变为空。我希望得到一些帮助来理解这一点。

4

6 回答 6

3

当您这样做时bar = null;,只需将某些内容分配给bar变量的值。它不会影响过去分配给 的内容bar。该对象继续存在,如果有其他对它的引用,它仍然存在,其价值不受影响。

当你这样做时:

var foo = [5, 10];
var bar = foo;

你有三个实体。您有一个数组[5,10]和两个变量,每个变量都引用了该数组。如果您更改数组,那么由于两个变量都指向同一个数组,因此无论您通过哪个变量引用数组,您都会看到更改。

但是,如果您设置bar = null,那只会影响bar不再引用数组的变量。它根本不影响仍然指向的数组foo

事实上,如果你这样做:

var foo = [5, 10];
var bar = foo;
bar = [20,30];

你会有同样的结果。在第二行代码之后都bar指向foo同一个数组,但是在第三行之后,bar现在指向一个新数组并且只foo指向原来的数组。关键是要意识到使用bar修改它指向的对象bar[0] = 1和重新分配 bar 的整个值是有区别的bar = [20,30]。在第一种情况下,foobar指向的基础对象发生了变化。在第二种情况下,bar最初指向的底层对象没有被触及。相反,bar改为指向一个新对象并且不触及先前的对象。

于 2012-08-07T00:03:18.043 回答
2

区别在于重新绑定和变异操作。

bar[0] = 1

正在变异;它会影响bar指向的对象。

bar = null

正在重新绑定;它只会影响标识符的bar含义。

于 2012-08-07T00:06:34.910 回答
0

您有两个指向数组的指针。Bar = foo 复制原始指针。取消引用 bar 不会取消引用 foo。

阅读更多@ http://snook.ca/archives/javascript/javascript_pass

于 2012-08-07T00:08:04.767 回答
0

当你这样做

var foo = [5, 10];

它创建对数组的引用,如下所示

foo --->  [5, 10]

当你分配bar给 时foo,你现在有

foo --->  [5, 10]

bar ------^

你打电话时

bar[0] = 1;

你得到

foo --->  [1, 10]

bar ------^

wherefoobar指向同一个对象。

你打电话时

bar = null;

你现在有

foo --->  [1, 10]
于 2012-08-07T00:08:50.957 回答
0

参考,但它的定义只是指向某个对象的指针。当您分配null给 bar 时,您只需删除存储在 中的这个“指针” bar,使其不再指向对象。

把它想象成一个写在纸上的地址。如果工作表foobar上面有相同的地址,你发出一个命令:去写在工作表上的地址foo,把东西放在那里,操作完成后,自然地,任何人查看这些工作表并检查该地址,都会找到那些变化。现在你的分配null就像用橡皮擦从工作表上擦这个地址一样。它既不会触及任何其他床单,也不会以任何方式触及房屋。

于 2012-08-07T00:09:19.077 回答
0

我喜欢将变量视为标签。使解释它们更容易。

//Create an array containing 5 and 10, and put the label "foo" on it
var foo = [5, 10];
//Put the label "bar" on the thing with the label "foo"
var bar = foo;      
console.log(foo); //[5, 10]
console.log(bar); //[5, 10]
//Take the thing labeled "bar" (which also has the label "foo") and change the first element to 1
bar[0] = 1;         
console.log(foo); //[1, 10]
//Take the label "bar" and attach it to nothing
bar = null;
console.log(foo); //[1, 10]

var foo = [5, 10]; var bar = foo; 控制台.log(foo); //[5, 10] console.log(bar); //[5, 10] bar[0] = 1; 控制台.log(foo); //[1, 10] bar = null; 控制台.log(foo); //[1, 10]

于 2012-08-07T00:13:12.277 回答