該文章主要用於本身在平時學習記錄使用javascript
主要是針對js中引用類型的複製。在引用類型中,定義的變量至關於一個指針,指向了某個對象或數組的引用java
let obj = {a: 1, b: 1};
let newObj = obj;
newObj.a = 2;
console.log(obj.a); // 2
複製代碼
newObj
和obj
這兩個變量都存儲了指向對象的一個引用地址,實則共用一個對象,因此當改變newObj.a = 2
時,obj.a
也發生改變。這就是淺拷貝。數組
深拷貝就是讓newObj.a
發送變化時,obj.a
不發生變化,newObj
和obj
至關於兩個徹底不一樣的對象。bash
slice()
或者concat()
或者ES6中的擴展運算符
(該方法也可用於一個對象)方法,可是該方法有個問題,當數組的元素也是一個引用類型時,則沒法進行深層次的深拷貝。let arr = [1, 2, [3, 4], {a: 1, b: 2}];
let newArr = arr.slice(); //newArr -> [1, 2, [3, 4], {a: 1, b: 2}]
newArr[0] = 'change';
console.log(arr, newArr);
複製代碼
能夠發現:
newArr
經過slice()
方法複製了arr
,當改變newArr
第一層的元素時,arr
不受影響學習當改變深層的元素內容時,再來看一下效果:測試
能夠發現:
newArr
和arr
的元素值都有變化ui經測試,
concat()
和ES6拓展運算符
與slice()
狀況相同,有興趣的童鞋能夠本身試驗下,童叟無欺!!!spa
最暴力、最直接的方式:JSON.parse(JSON.stringify(obj))
,可是該方法也有一些缺陷:3d
undefined
或 null
時:let arr = [undefined, 1, 2, 3, null];
console.log(JSON.parse(JSON.stringify(arr))); // [ null, 1, 2, 3, null ];
複製代碼
其中undefined
被轉爲null
, null
依然爲null
;指針
value
爲undefined
或者 null
時:let obj = {a: 1, b: undefined, c: null, d: 'null', e: 'undefined'};
console.log(JSON.parse(JSON.stringify(obj))); // { a: 1, c: null, d: 'null', e: 'undefined' }
複製代碼
其中value
爲undefined
的屬性被剔除,其他狀況不變。