当您这样做时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]。在第一种情况下,foo和bar指向的基础对象发生了变化。在第二种情况下,bar最初指向的底层对象没有被触及。相反,bar改为指向一个新对象并且不触及先前的对象。