簡體   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