繁体   English   中英

在 JavaScript 中,分配给变量的对象如何跟踪未来的变化?

[英]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

因此,当我尝试遵循头脑中的逻辑时,我将其描绘如下:

在第一次迭代中, headpoint持有以下信息:

{
  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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM