JavaScript實(shí)現(xiàn)淺拷貝與深拷貝的方法分析
本文實(shí)例講述了JavaScript實(shí)現(xiàn)淺拷貝與深拷貝的方法。分享給大家供大家參考,具體如下:
平時(shí)使用數(shù)組復(fù)制時(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ù)組會相互受到影響。所以,必須要有一種不受影響的方法,那就是深拷貝。
深拷貝的實(shí)現(xiàn)方式有很多種。
一、for循環(huán)實(shí)現(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方法實(shí)現(xiàn)深拷貝
//slice實(shí)現(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實(shí)現(xiàn)深拷貝
//concat實(shí)現(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擴(kuò)展運(yùn)算實(shí)現(xiàn)深拷貝
//es6擴(kuò)展運(yùn)算實(shí)現(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"}
六、對象轉(zhuǎn)換成json實(shí)現(xiàn)深拷貝
//轉(zhuǎn)換成json let obj3 = JSON.parse(JSON.stringify(obj)); console.log(obj3) //{id: "0", name: "king", sex: "man"}
七、es6擴(kuò)展運(yùn)算實(shí)現(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; }
總結(jié):深刻理解javascript的深淺拷貝,可以靈活的運(yùn)用數(shù)組,并且可以避免很多bug。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計(jì)有所幫助。
- Javascript 淺拷貝、深拷貝的實(shí)現(xiàn)代碼
- JavaScript數(shù)組深拷貝和淺拷貝的兩種方法
- 淺談JavaScript中面向?qū)ο蟮牡纳羁截惡蜏\拷貝
- js對象淺拷貝和深拷貝詳解
- javascript對淺拷貝和深拷貝的詳解
- javascript深拷貝和淺拷貝詳解
- 淺析javaScript中的淺拷貝和深拷貝
- JavaScript基礎(chǔ)心法 深淺拷貝(淺拷貝和深拷貝)
- javascript深拷貝、淺拷貝和循環(huán)引用深入理解
- JavaScript深拷貝和淺拷貝概念與用法實(shí)例分析
- JS淺拷貝和深拷貝原理與實(shí)現(xiàn)方法分析
- JS中實(shí)現(xiàn)淺拷貝和深拷貝的代碼詳解
- javascript二維數(shù)組和對象的深拷貝與淺拷貝實(shí)例分析
- javascript 關(guān)于賦值、淺拷貝、深拷貝的個(gè)人理解
- JS賦值、淺拷貝和深拷貝(數(shù)組和對象的深淺拷貝)實(shí)例詳解
- 詳解JS深拷貝與淺拷貝
- JS對象復(fù)制(深拷貝和淺拷貝)
- js深拷貝與淺拷貝一文徹底搞懂
相關(guān)文章
JavaScript遞歸函數(shù)解“漢諾塔”算法代碼解析
這篇文章主要介紹了JavaScript遞歸函數(shù)解“漢諾塔”算法代碼解析,需要的朋友可以參考下2018-07-07深入理解JavaScript系列(6):S.O.L.I.D五大原則之單一職責(zé)SRP
Bob大叔提出并發(fā)揚(yáng)了S.O.L.I.D五大原則,用來更好地進(jìn)行面向?qū)ο缶幊?/div> 2012-01-01JS實(shí)現(xiàn)的點(diǎn)擊按鈕圖片上下滾動效果示例
這篇文章主要介紹了JS實(shí)現(xiàn)的點(diǎn)擊按鈕圖片上下滾動效果,涉及javascript事件響應(yīng)及頁面元素屬性動態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-01-01js中匿名函數(shù)的創(chuàng)建與調(diào)用方法分析
這篇文章主要介紹了js中匿名函數(shù)的創(chuàng)建與調(diào)用方法,詳細(xì)分析了匿名函數(shù)的原理與用法,以及閉包的原理分析,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12javascript實(shí)現(xiàn)輪顯新聞標(biāo)題鏈接
這篇文章主要介紹了javascript實(shí)現(xiàn)輪顯新聞標(biāo)題鏈接的相關(guān)資料,需要的朋友可以參考下2007-08-08基于Node.js的JavaScript項(xiàng)目構(gòu)建工具gulp的使用教程
也許你使用過grunt,那么這里來安利gulp的話就更加不會陌生了,下面我們就來看一下基于Node.js的JavaScript項(xiàng)目構(gòu)建工具gulp的使用教程2016-05-05最新評論