JSON.stringify()是目前前端開發過程中最常用的深拷貝方式,
原理是把有個對象序列化成為一個 JSON 字符串,將對象的內容轉換成字符串的形式再保存到磁盤上,
再用 JSON.parse()反序列化將 JSON 字符串變成一個新的對象
1 let obj1 = { 2 a: 1, 3 b: [1, 2, 3], 4 }; 5
6 let str = JSON.stringify(obj1); 7 let obj2 = JSON.parse(str); 8 console.log(obj2); //{ a: 1, b: [ 1, 2, 3 ] }
9
10 //修改obj1
11 obj1.a = 2; 12 obj1.b.push(4); 13 console.log(obj1); //{ a: 2, b: [ 1, 2, 3, 4 ] }
14 console.log(obj2); //{ a: 1, b: [ 1, 2, 3 ] }
通過 JSON.stringify 實現深拷貝有幾點要注意
- 拷貝的對象的值中如果有函數,undefined,symbol 則經過 JSON.stringify()序列化后的 JSON 字符串中這個鍵值對會消失
- 無法拷貝不可枚舉的屬性,無法拷貝對象的原型鏈
- 拷貝 Date 引用類型會變成字符串
- 拷貝 RegExp 引用類型會變成空對象
- 對象中含有 NaN、Infinity 和-Infinity,則序列化的結果會變成 null
- 無法拷貝對象的循環應用(即 obj[key] = obj)
學習記錄