簡體   English   中英

我正在嘗試學習鏈表,我不知道為什么我的 object 中有一個循環

[英]am trying to learn Linked list and i don't know why there is a loop in my object

我希望它運行一次,但 obj2.b 中有一個對象循環一個接一個。 為什么它不調用它一次?:


const test2 = function (numb) {
//making an object
  let obj1 = {
    a: 1,
    b: 2,
  };

    let obj2 = {
    d: numb,
    e: null,
  };
  let obj3 = obj2;
  obj3.b = obj2;
  console.log(obj3);
};
test2(3);

在 JS 中初始化對象

在 JavaScript 中,對象是通過引用分配的。 這意味着let obj3 = obj2導致obj3obj2指向相同的 object。也就是說,如果您更改obj3 ,您將更改 memory obj2引用(因為它們引用相同的位置),從而更改obj2 簡而言之obj2obj3是同一個對象! . 可視化:

let obj1 = {a: 0};
let obj2 = obj1;
//obj1 and obj2 = {a: 0};

obj2.b = 1;
//obj1 and obj2 = {a: 0, b: 1};

你得到循環引用的原因

考慮到對象在 JavaScript 中的工作方式,您可以快速計算出事實上,將obj2初始化為obj3.b的值與執行obj3.b = obj3 obj3 相同,這顯然是一個循環。 因為每次分配obj3時,您還必須將其分配給obj3.b ,然后再分配給obj3.bb ,依此類推。

初始化兩個獨立的對象

如果初始化 object 應該是另一個標准方法的副本不能按預期工作,如何正確執行? 最簡單的方法是在空的 object 上使用Object.assign() ,這樣我們就創建了一個全新的引用,指向一個全新的 object,並通過這個新引用分配所有數據。

let obj1 = {a: 0};
let obj2 = Object.assign({}, obj1);
//obj1 = {a: 0}
//obj2 = {a: 0}

obj2.b = 1;
//obj1 = {a: 0}
//obj2 = {a: 0, b: 1}

那么如何修復function呢?

不要使用=obj2定義為obj3 (如您現在所知,會將它們都引用到同一個對象),而是使用上面提到的方法:

const test2 = function (numb) {
//making an object
  let obj1 = {
    a: 1,
    b: 2,
  };

    let obj2 = {
    d: numb,
    e: null,
  };
  
  let obj3 = {};
  obj3 = Object.assign(obj3, obj2);
  /** 
    * You can do it in one line too
    * let obj3 = Object.assign({}, obj2);
    */

  obj3.b = obj2;
  console.log(obj3); 
};

test2(3); 
//{ d: 3, e: null, b: { d: 3, e: null } }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM