为何secondList变量的值未被清除?JavaScript引用类型疑问
为什么secondList变量的值没有被清除?
先看你给出的原始代码:
let list = { value: 1, next: { value: 2, next: { value: 3, next: { value: 4, next: null } } } };
执行下面两段代码后,secondList并没有被清除:
let secondList = list.next.next; list.next.next = null;
原因很简单——JavaScript里的对象是引用类型,变量存的不是对象本身,而是指向对象内存位置的引用地址:
- 执行
let secondList = list.next.next;时,secondList复制了list.next.next当时的引用地址,两者指向内存中同一个{value:3, next:{...}}对象。 - 而
list.next.next = null;只是把list.next的next属性值(也就是那个引用地址)替换成了null,并没有删除原来的对象,也没改变secondList存储的引用地址。
打个比方:你和朋友各持一把同一间房的钥匙(引用地址),你把自己的钥匙换成了废钥匙(设为null),但朋友手里的钥匙还是能打开那间房,房子本身根本没被拆掉。只要还有变量持有对象的引用,这个对象就不会被垃圾回收机制清理,secondList自然还能访问它。
内容的提问来源于stack exchange,提问作者Pavlo Zalutskiy
相关产品推荐
相关产品推荐

