为什么引用 = null 不会影响引用的对象
Why does reference = null not affect the referenced object?
我知道这有效,但我不知道为什么或为什么它以这种方式工作背后的原因:
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 的整个值(如 bar = [20,30]
)之间存在差异。 在第一种情况下,foo
和bar
指向的基础对象都会更改。 在第二种情况下,bar
最初指向的基础对象不会被触摸。 相反,bar
更改为指向新对象,并且不会触及先前的对象。
区别在于重新绑定和改变操作。
bar[0] = 1
正在变异;它会影响bar
指向的对象。
bar = null
是重新绑定;它只是影响标识符bar
的含义。
您有两个指向数组的指针。bar = foo 复制原始指针。 取消引用栏不会取消引用 foo。
阅读更多 @http://snook.ca/archives/javascript/javascript_pass
引用,但它的定义只是指向某个对象的指针。当您将null
分配给 bar 时,您只需删除存储在 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 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 ------^
其中foo
和bar
指向同一对象。
当您致电时
bar = null;
你现在有
foo ---> [1, 10]
- 引用对象中的通用值
- 如何在JavaScript中将字符串转换为函数引用
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 在动态创建的元素上获取对特定选择器的引用
- IIFE中的函数引用不可用
- 如何通过引用var Using DataTables来进行分页或排序
- 如何在创建键时引用来自同一对象的键
- Datatables:通过DOM数据源中的名称引用列
- 自引用回调
- 引用类变量中的原型方法
- 鼠标悬停事件影响列表中所有行中的按钮,而不仅仅是特定按钮
- 无法获取属性'selectedIndex'的未定义引用或null引用
- 在同一个服务工作者中处理service-worker.js有任何影响吗
- 为什么引用 = null 不会影响引用的对象
- 将对象与空引用进行比较时位置的影响
- 在js对象中维护父引用是否有影响?
- 全局“窗口”是如何实现的?引用影响生命周期中的垃圾收集
- Javascript-通过引用访问对象会对性能造成很大影响吗
- 防止类的所有引用都受到触发函数的影响
- 两次引用同一个js文件是否有任何不良影响?