JavaScript實現(xiàn)淺拷貝與深拷貝的方法分析
本文實例講述了JavaScript實現(xiàn)淺拷貝與深拷貝的方法。分享給大家供大家參考,具體如下:
平時使用數(shù)組復制時,我們大多數(shù)會使用‘=',這只是淺拷貝,存在很多問題。比如
let arr = [1,2,3,4,5]; let arr2 = arr; console.log(arr) //[1, 2, 3, 4, 5] console.log(arr2) //[1, 2, 3, 4, 5] arr[0] = 6; console.log(arr) //[6, 2, 3, 4, 5] console.log(arr2) //[6, 2, 3, 4, 5] arr2[4] = 7; console.log(arr) //[6, 2, 3, 4, 7] console.log(arr2) //[6, 2, 3, 4, 7]
很明顯,淺拷貝下,拷貝和被拷貝的數(shù)組會相互受到影響。所以,必須要有一種不受影響的方法,那就是深拷貝。
深拷貝的實現(xiàn)方式有很多種。
一、for循環(huán)實現(xiàn)深拷貝
//for循環(huán)copy
function copy(arr) {
let cArr = []
for(let i = 0; i < arr.length; i++){
cArr.push(arr[i])
}
return cArr;
}
let arr3 = [1,2,3,4];
let arr4 = copy(arr3) //[1,2,3,4]
console.log(arr4) //[1,2,3,4]
arr3[0] = 5;
console.log(arr3) //[5,2,3,4]
console.log(arr4) //[1,2,3,4]
二、slice方法實現(xiàn)深拷貝
//slice實現(xiàn)深拷貝 let arr5 = [1,2,3,4]; let arr6 = arr5.slice(0); arr5[0] = 5; console.log(arr5); //[5,2,3,4] console.log(arr6); //[1,2,3,4]
三、concat實現(xiàn)深拷貝
//concat實現(xiàn)深拷貝 let arr7 = [1,2,3,4]; let arr8 = arr7.concat(); arr7[0] = 5; console.log(arr7); //[5,2,3,4] console.log(arr8); //[1,2,3,4]
四、es6擴展運算實現(xiàn)深拷貝
//es6擴展運算實現(xiàn)深拷貝 let arr9 = [1,2,3,4]; let [...arr10] = arr9; arr9[0] = 5; console.log(arr9) //[5,2,3,4] console.log(arr10) //[1,2,3,4]
五、對象的循環(huán)深拷貝
// 循環(huán)copy對象
let obj = {
id:'0',
name:'king',
sex:'man'
}
let obj2 = copy2(obj)
function copy2(obj) {
let cObj = {};
for(var key in obj){
cObj[key] = obj[key]
}
return cObj
}
console.log(obj) //{id: "0", name: "king", sex: "man"}
console.log(obj2) //{id: "0", name: "king", sex: "man"}
六、對象轉換成json實現(xiàn)深拷貝
//轉換成json
let obj3 = JSON.parse(JSON.stringify(obj));
console.log(obj3) //{id: "0", name: "king", sex: "man"}
七、es6擴展運算實現(xiàn)深拷貝
let {...obj4}= obj
console.log(obj4) //{id: "0", name: "king", sex: "man"}
八、通用深拷貝
var clone = function (v) {
var o = v.constructor === Array ? [] : {};
for(var i in v){
o[i] = typeof v[i] === "object" ? clone(v[i]) : v[i];
}
return o;
}
總結:深刻理解javascript的深淺拷貝,可以靈活的運用數(shù)組,并且可以避免很多bug。
更多關于JavaScript相關內(nèi)容感興趣的讀者可查看本站專題:《javascript面向對象入門教程》、《JavaScript錯誤與調(diào)試技巧總結》、《JavaScript數(shù)據(jù)結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數(shù)學運算用法總結》
希望本文所述對大家JavaScript程序設計有所幫助。
- Javascript 淺拷貝、深拷貝的實現(xiàn)代碼
- JavaScript數(shù)組深拷貝和淺拷貝的兩種方法
- 淺談JavaScript中面向對象的的深拷貝和淺拷貝
- js對象淺拷貝和深拷貝詳解
- javascript對淺拷貝和深拷貝的詳解
- javascript深拷貝和淺拷貝詳解
- 淺析javaScript中的淺拷貝和深拷貝
- JavaScript基礎心法 深淺拷貝(淺拷貝和深拷貝)
- javascript深拷貝、淺拷貝和循環(huán)引用深入理解
- JavaScript深拷貝和淺拷貝概念與用法實例分析
- JS淺拷貝和深拷貝原理與實現(xiàn)方法分析
- JS中實現(xiàn)淺拷貝和深拷貝的代碼詳解
- javascript二維數(shù)組和對象的深拷貝與淺拷貝實例分析
- javascript 關于賦值、淺拷貝、深拷貝的個人理解
- JS賦值、淺拷貝和深拷貝(數(shù)組和對象的深淺拷貝)實例詳解
- 詳解JS深拷貝與淺拷貝
- JS對象復制(深拷貝和淺拷貝)
- js深拷貝與淺拷貝一文徹底搞懂
相關文章
js通過元素class名字獲取元素集合的具體實現(xiàn)
獲取元素集合的方法有很多,接下來為大家介紹喜愛使用js通過元素class名字獲取元素集合的方法2014-01-01
parseInt parseFloat js字符串轉換數(shù)字
轉換函數(shù)、強制類型轉換、利用js變量弱類型轉換。2010-08-08
詳解js模板引擎art template數(shù)組渲染的方法
art-template 是一個簡約、超快的模板引擎。這篇文章主要介紹了詳解js模板引擎art template數(shù)組渲染的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10
JavaScript暫停和繼續(xù)定時器的實現(xiàn)方法
這篇文章主要介紹了JavaScript暫停和繼續(xù)定時器的方法的相關資料,非常不錯,需要的朋友可以參考下2016-07-07

