我知道这工作,但我不知道为什么还是后面为什么要制作它的工作这样的理由:
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
为好。 我喜欢一些帮助理解这一点。
当你做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 = [20,30]
在第一种情况下,底层的对象,这两个foo
和bar
点被改变。 在第二种情况下,底层对象bar
到没有触摸最初指出。 相反, bar
被更改为指向一个新的对象和之前的对象不感动。
你有两个指针数组。 酒吧= foo的复制原始的指针。 解引用栏不提领富。
阅读更多@ http://snook.ca/archives/javascript/javascript_pass
参考,但它的定义就是一个指向某个对象。 当您指定null
吧,你只需删除存储在这个“指针” bar
,使其不再指向对象。
想象一下,这是一个地址,写在纸张上。 如果表foo
和bar
有它相同的地址和您发出一个命令:去解决写在纸foo
,把东西在房子里,操作完成后,自然地,凡看见任何的床单,并签出该地址,会发现这些变化。 现在你的任务null
只是同用橡皮擦从片擦这个地址。 它不触及任何没有其他工作表,也没有房子以任何方式。
我喜欢把变量标签。 使解释他们更容易。
//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富= [5,10]。 VAR条= FOO; 的console.log(FOO); // [5,10]的console.log(巴); // [5,10]栏[0] = 1; 的console.log(FOO); // [1 10]棒= NULL; 的console.log(FOO); // [1 10]
当你做
var foo = [5, 10];
它创建一个数组的引用,这样
foo ---> [5, 10]
当您指定bar
,以foo
,你现在有
foo ---> [5, 10]
bar ------^
你打电话时
bar[0] = 1;
你得到
foo ---> [1, 10]
bar ------^
其中foo
和bar
指向同一个对象。
你打电话时
bar = null;
你现在有
foo ---> [1, 10]