javascript - 在 JavaScript 中,分配给变量的对象如何跟踪未来的突变?
问题描述
我最近一直在用 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
首先保存以下信息:
{
val: 1,
next: {
val: 1,
next: null
}
}
也是如此head
,但是下一步让我感到困惑。在我的脑海中,我在point
之前的步骤中用新创建的节点覆盖了当前值,所以变量应该如下所示:
{
val: 1,
next: null
}
并且head
因为它只是持有一个参考point
应该看起来像那样。但是,head
看起来如下:
{
val: 1,
next: {
val: 1,
next: null
}
}
并且随着迭代的继续进行,显然,head
会跟踪所有链接的节点。这是期望的行为,但我不完全理解这是如何发生的。有人可以解释一下为什么会这样吗?
解决方案
在 JavaScript 中,变量不绑定到其他变量。它们绑定到当时变量的值,在您的情况下是初始point
对象。
听起来你的心智模型告诉你
head
-> point
-> {} 实际上两者都指向同一个对象,因此绑定point
到新对象不会影响head
。
head
不在循环中,因此head
一旦将其绑定到绑定的第一个对象,您就永远不会真正更新它的值point
。
推荐阅读
- julia - Julia:用于绘制相同数据的两个 x 轴
- java - 如何使用java将普通英语、俄语(西里尔文)和编码俄语字符串的混合字符串转换为普通字符串
- android - 文本小部件中数字数据的颤动百分比
- json - 如何使用 ubuntu bash foreach json 数组名称值 az 组列表
- sql - 使用从列表框中传递的值访问 VBA 运行查询
- java - 使用输入的数字创建一个星方
- image - 如何使用 Flutter 将图像上传到服务器
- javascript - 将 cookie 数据从父级发送到 iframe
- ios - UIRefreshControl 正常运行但没有动画
- python - 将大型 Pandas Dataframe 从“稀疏”浮点数转换为 int