【发布时间】:2016-06-11 22:32:06
【问题描述】:
我正在创建一个函数来删除给定列表的最后一个节点(作为参数输入)。该函数本身非常简单,如下所示。
function popBack(list) {
var current = list.head,
previous;
while (current.next) {
previous = current;
current = current.next;
}
// console.log(current);
// console.log(previous.next);
// current = null;
// console.log(current);
// console.log(previous.next);
previous.next = null;
return list;
}
由于列表中的下一个节点被它之前的节点引用,previous.next 和 current 应该指向同一个对象。这让我想到了我的问题。如果我设置current 等于null,那不是previous.next 也等于null 吗?情况似乎并非如此,因为 previous.next 仍然引用 current 曾经的样子。谁能解释一下为什么会这样?
提前致谢。
【问题讨论】:
-
一个很常见的菜鸟错误是认为两个变量是相同的,当你改变一个时,你就改变了另一个。不过,您说得对:它们都只是指向同一个对象。然后其中一个停止指向。另一个在它的指向性上没有改变。如果你想让两个变量停止指向,你必须分别对它们大喊大叫。
-
正如 Amadan 所说,您实际上并没有删除对象,只是更改了
.next引用的内容。 -
嘿阿马丹,非常感谢您的及时回复。我从您的回复中得到的是,通过设置
current = null,它会阻止current指向previous.next指向的同一个对象。所以现在current指向一个没有价值的新内存库。这是正确的吗? -
差不多但不完全。
null是一个原始值:JS 变量 引用 对象(您也可以说“包含对象引用”,尽管您实际上不能像从 C 中那样直接从 JS 中看到它们),但包含原语。因此,“current指向null”是不正确的; “current包含null”是。由于包含null,current不再指向任何地方。