摘要:先來普及一下深拷貝和淺拷貝的區(qū)別淺拷貝就是簡單的復(fù)制,用等號即可完成這就完成了一個淺拷貝但是當(dāng)修改對象的時候,我們發(fā)現(xiàn)對象的值也被改變了這是因?yàn)闇\拷貝只復(fù)制了指向?qū)ο蟮闹羔?,新舊對象共用同一塊內(nèi)存,修改某一個對象的同時也會把另一個都一并修改
先來普及一下深拷貝和淺拷貝的區(qū)別
淺拷貝:就是簡單的復(fù)制,用等號即可完成
let a = {a: 1} let b = a
這就完成了一個淺拷貝
但是當(dāng)修改對象b的時候,我們發(fā)現(xiàn)對象a的值也被改變了
b.a = 10 console.log(a.a) => 10
這是因?yàn)闇\拷貝只復(fù)制了指向?qū)ο蟮闹羔?,新舊對象共用同一塊內(nèi)存,修改某一個對象的同時也會把另一個都一并修改了
深拷貝:跟淺拷貝最簡單明了的區(qū)別就是修改拷貝的對象,不會改變源對象
利用Object.assign可以對只有一層的對象實(shí)現(xiàn)深拷貝,如下:
let a = {a: 1,b: 2,c: 3} let b = Object.assign({}, a) b.b = 100 console.log(a.b) => 2
可以看出來這樣是完全可以做到對只有一層的對象實(shí)現(xiàn)深拷貝的
但是如果對象里面的元素還是對象的話就沒作用了
let a = {a: 1,b: 2,c: 3, d: {a: 1}} let b = Object.assign({}, a) b.d.a = 100 console.log(a.d.a) => 100
對于這種比較復(fù)雜的對象,我們就可以利用遞歸的方式實(shí)現(xiàn)真正的對象深拷貝了
function deepClone (sourceObj, targetObj) { let cloneObj = targetObj || {} if(!sourceObj || typeof sourceObj !== "object" || sourceObj.length === undefined){ return sourceObj } if(sourceObj instanceof Array){ cloneObj = sourceObj.concat() } else { for(let i in sourceObj){ if (typeof sourceObj[i] === "object") { cloneObj[i] = deepClone(sourceObj[i], {}) } else { cloneObj[i] = sourceObj[i] } } } return cloneObj }
簡單的幾行代碼就可以輕松實(shí)現(xiàn)對象的深拷貝
簡單的測試代碼,如下: let sourceObj = { a: 1, b: { a: 1 }, c: { a: 1, b: { a: 1 } }, d: function() { console.log("hello world") }, e: [1, 2, 3] } let targetObj = deepClone(sourceObj, {}) targetObj.c.b.a = 9 console.log(sourceObj) => { a: 1, b: { a: 1 }, c: { a: 1, b: { a: 1 } }, d: [Function: d], e: [ 1, 2, 3 ] } console.log(targetObj) => { a: 1, b: { a: 1 }, c: { a: 1, b: { a: 9 } }, d: [Function: d], e: [ 1, 2, 3 ] }
另外介紹兩個用來做深拷貝的庫
**jquery** 使用方法: let targetObj = $.extent(true,{},sourceObj) **lodash函數(shù)庫** 使用方法: npm install lodash **es5寫法** let lodash = require("lodash") **es6寫法** import lodash from "lodash" let targetOj = lodash.cloneDeep(sourceObj)
各位看官覺得有什么地方不對的請多多指教。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/96712.html
摘要:在中可以通過添加一個參數(shù)來實(shí)現(xiàn)遞歸,調(diào)用就可以實(shí)現(xiàn)一個深拷貝。利用序列化實(shí)現(xiàn)一個深拷貝 在JavaScript中,對于Object和Array這類引用類型值,當(dāng)從一個變量向另一個變量復(fù)制引用類型值時,這個值的副本其實(shí)是一個指針,兩個變量指向同一個堆對象,改變其中一個變量,另一個也會受到影響。 這種拷貝分為兩種情況:拷貝引用和拷貝實(shí)例,也就是我們說的淺拷貝和深拷貝 淺拷貝(shallow...
摘要:原文地址基礎(chǔ)心法深淺拷貝歡迎。上面的代碼是最簡單的利用賦值操作符實(shí)現(xiàn)了一個淺拷貝,可以很清楚的看到,隨著和改變,和也隨著發(fā)生了變化。展開運(yùn)算符結(jié)論實(shí)現(xiàn)的是對象第一層的深拷貝。 原文地址:JavaScript基礎(chǔ)心法——深淺拷貝 歡迎star。 如果有錯誤的地方歡迎指正。 淺拷貝和深拷貝都是對于JS中的引用類型而言的,淺拷貝就只是復(fù)制對象的引用,如果拷貝后的對象發(fā)生變化,原對象也會發(fā)生...
摘要:相信人很多學(xué)習(xí)的過程中都踩了深拷貝和淺拷貝的坑,深拷貝和淺拷貝的區(qū)別我就不再贅述了,今天我來寫一下我自己實(shí)現(xiàn)深拷貝的各種方法。中的深拷貝也是用類似方法實(shí)現(xiàn)。 相信人很多學(xué)習(xí)js的過程中都踩了深拷貝和淺拷貝的坑,深拷貝和淺拷貝的區(qū)別我就不再贅述了,今天我來寫一下我自己實(shí)現(xiàn)深拷貝的各種方法。 比較簡單的拷貝方式可以借用瀏覽器的Json對象去實(shí)現(xiàn),先把對象轉(zhuǎn)化為json字符串,在解析回對...
摘要:前言里面淺拷貝和深拷貝是非常關(guān)鍵的知識點(diǎn),今天就來通過本文清楚的了解深淺拷貝以及該如何實(shí)現(xiàn)這兩種拷貝方式。對象的拷貝又分為淺拷貝和深拷貝。印證了上述所說的對于所有的基本類型,簡單的賦值已經(jīng)是實(shí)現(xiàn)了深拷貝。 前言 JavaScript里面淺拷貝和深拷貝是非常關(guān)鍵的知識點(diǎn),今天就來通過本文清楚的了解深淺拷貝以及該如何實(shí)現(xiàn)這兩種拷貝方式。 深淺拷貝的區(qū)別 拷貝:其實(shí)就是一個對象復(fù)制給另外...
摘要:深拷貝淺拷貝本文主要對深拷貝淺拷貝的解釋及實(shí)現(xiàn)做一下簡單記錄。之所以會有深拷貝與淺拷貝之分,是因?yàn)椴煌瑪?shù)據(jù)類型的數(shù)據(jù)在內(nèi)存中的存儲區(qū)域不一樣。但注意,只能做一層屬性的淺拷貝。 深拷貝VS淺拷貝 本文主要對深拷貝&淺拷貝的解釋及實(shí)現(xiàn)做一下簡單記錄。原文鏈接,歡迎star。 之所以會有深拷貝與淺拷貝之分,是因?yàn)椴煌瑪?shù)據(jù)類型的數(shù)據(jù)在內(nèi)存中的存儲區(qū)域不一樣。 堆和棧是計算機(jī)中劃分出來用來存儲的...
閱讀 3750·2021-11-15 11:37
閱讀 2339·2021-09-24 10:39
閱讀 2523·2021-07-25 21:37
閱讀 1507·2019-08-30 15:56
閱讀 2603·2019-08-30 15:55
閱讀 987·2019-08-30 15:54
閱讀 2146·2019-08-30 14:21
閱讀 875·2019-08-30 11:24