Shallow Copy VS Deep Copy

- Shallow Copy(淺拷貝): 只複製指向某個物件的指標,而不複製物件本身,新舊物件還是共用同一塊記憶體。
- Deep Copy(深拷貝): 會另外創造一個一模一樣的物件,新物件跟原物件不共用記憶體,修改新物件不會改到原物件內容。
如何 Deep Copy
- 手動複製(建立一個物件,手動把值弄進去)
- Object.assign(ES6語法,該語法先建立一個空物件,再把指定值塞進去,限單層,多層需另外處理)
1 2 3 4 5
| var obj1 = { a: 1, b: 2, c: 3 }; var obj2 = Object.assign({}, obj1); obj2.b = 100; console.log(obj1); // { a: 1, b: 2, c: 3 } <-- 值不變 console.log(obj2); // { a: 1, b: 100, c: 3 }
|
- 轉成 JSON 再轉回來(用JSON.stringify把物件轉成字串,再用JSON.parse把字串轉成新的物件,多層可以,有function情境不可,function沒辦法轉成JSON)
1 2 3 4 5
| var obj1 = { fun: function(){ console.log(123) } }; var obj2 = JSON.parse(JSON.stringify(obj1));
console.log(typeof obj1.fun); // 'function' console.log(typeof obj2.fun); // 'undefined' <-- 會undefined,
|
- 透過library處理,此處用JQuery處理
1 2 3 4 5 6 7 8
| var obj1 = { a: 1, b: { f: { g: 2 } }, c: [4, 5, 6] };
var obj2 = $.extend(true, {}, obj1); console.log(obj1.b.f === obj2.b.f); // false
|