为什么引用 = null 不会影响引用的对象

Why does reference = null not affect the referenced object?

本文关键字:引用 影响 对象 null 为什么      更新时间:2023-09-26

我知道这有效,但我不知道为什么或为什么它以这种方式工作背后的原因:

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];

你会得到同样的结果。 在第二行代码之后,barfoo 都指向同一个数组,但在第三行之后,bar 现在指向一个新数组,只有 foo 个指向原始数组。 关键是意识到使用 bar 来修改它指向的对象(如 bar[0] = 1)与重新分配 bar 的整个值(如 bar = [20,30])之间存在差异。 在第一种情况下,foobar指向的基础对象都会更改。 在第二种情况下,bar最初指向的基础对象不会被触摸。 相反,bar更改为指向新对象,并且不会触及先前的对象。

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

bar[0] = 1

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

bar = null

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

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

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

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

想象这是一个写在纸上的地址。如果工作表foobar具有相同的地址,并且您发出一个命令:转到写在工作表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 foo = [5, 10];var bar = foo;console.log(foo);[5, 10]控制台.log(酒吧);[5, 10]柱线[0] = 1;console.log(foo);[1, 10]柱线 = 空;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 ------^

其中foobar指向同一对象。

当您致电时

bar = null;

你现在有

foo --->  [1, 10]