[英]In JavaScript, how does an object assigned to a variable keeps track of future mutations?
我最近一直在用 JavaScript 练习数据结构,我发现了一段我无法理解的代码片段。 我知道当你将一个对象分配给一个变量,然后改变该对象时,原始变量可以“看到”这些变化,因为当你将对象分配给变量时,你不是在克隆对象,你只是将引用传递给它。 但是,以下代码让我感到困惑:
function ListNode(val, next) {
this.val = (val === undefined ? 0 : val)
this.next = (next === undefined ? null : next)
}
let tempList = [1, 1, 2, 4, 4, 100];
let point = new ListNode(tempList[0]);
let head = point;
for (let i = 1; i < tempList.length; i++) {
point.next = new ListNode(tempList[i])
point = point.next;
}
console.log(head); // Outputs the Linked List 1 -> 1 -> 2 -> 4 -> 4 -> 100
因此,当我尝试遵循头脑中的逻辑时,我将其描绘如下:
在第一次迭代中, head
和point
持有以下信息:
{
val: 1,
next: null
}
在第二次迭代中, point
first 保存了以下信息:
{
val: 1,
next: {
val: 1,
next: null
}
}
head
也是如此,但下一步是什么让我感到困惑。 在我的脑海中,我在之前的步骤中使用新创建的 Node 覆盖了point
的当前值,因此变量应如下所示:
{
val: 1,
next: null
}
和head
因为它只是从point
持有一个参考也应该看起来像那样。 但是, head
看起来如下:
{
val: 1,
next: {
val: 1,
next: null
}
}
并且随着迭代的继续进行,显然head
会跟踪所有链接的节点。 这是所需的行为,但我不完全理解这是如何发生的。 有人可以解释我为什么会这样吗?
当您重新分配point
它不会影响head
的引用。 它仍然指的是创建的第一个ListNode
。
这与做这样的事情没有什么不同:
let point = 1;
let head = point;
point = point + 1;
重新分配point
不会改变head
的值,即使它们一开始是等价的。
如果您熟悉 C 或 C++ 等语言,您可以将引用视为指针。 您从指向同一地址的两个指针开始,然后重新分配其中一个; 这不会改变另一个指针。
在 JavaScript 中,变量不绑定到其他变量。 它们绑定到当时变量的值,在您的情况下是初始point
对象。
听起来你的心智模型告诉你head
-> point
-> {} 实际上两者都指向同一个对象,因此绑定到新对象的point
不会影响head
。
head
不在循环中,因此一旦将head
绑定到第一个对象point
绑定到的第一个对象,您就不会实际更新head
的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.