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