在节点终端:
> o={a:1}
{ a: 1 }
> p=o //set p=o(if I change anything in p or o, it reflects to the references
{ a: 1 }
> p=null //but setting p=null
null
> o
{ a: 1 } //don't set o to null
所以我问,为什么会发生这种情况,更重要的是,通过一个引用(或原始引用),我可以删除对该内存位置的每个引用吗?
所以这样,我可以在做什么事情时删除'o'?
由于
答案 0 :(得分:1)
为什么会发生这种情况
引用和对象是不同的东西。您已重新分配p
以指向null
(概念上)。这并没有影响其他参考文献。
通过一个引用(或原始引用)可以删除对该内存位置的每个引用吗?
不,这是不可能的。
答案 1 :(得分:1)
为什么会这样:
p
和o
在技术上不是对象,它们是对象的引用。只要存在至少一个对象,该对象就存在。*
当你将p设置为null时,你只是改变p使它不再引用与o相同的对象 - 你正在改变引用的值,而不是对象的值。除了将每个引用单独设置为null之外,没有任何机制可以除去对象的所有引用。
但是,您可以使用任何引用来删除对象上的所有属性,例如你可以这样做:
delete p.a;
这将使o引用一个现在为空的对象。
*它比这更复杂,因为现代JavaScript引擎可以正确地进行垃圾收集循环引用。