摘要:而大多數(shù)實(shí)際項(xiàng)目中,我們想要的結(jié)果是兩個(gè)變量初始值相同互不影響。所以就要使用到拷貝分為深淺兩種深淺拷貝的區(qū)別淺拷貝只復(fù)制一層對(duì)象的屬性,而深拷貝則遞歸復(fù)制了所有層級(jí)。
為什么會(huì)用到淺拷貝和深拷貝
首先來(lái)看一下如下代碼
let a = b = 2 a = 3 console.log(a) console.log(b) let c = d = [1,2,3] let e = f = {a:1,b:2,c:3} c[0] = 2 e.a = 2 console.log(d[0]) console.log(f.a)
你會(huì)發(fā)現(xiàn),同一個(gè)Array或者Object賦值給兩個(gè)不同變量時(shí),變量指向的是同一個(gè)內(nèi)存地址,所以就會(huì)造成其中一個(gè)變量改變屬性值,同時(shí)改變了另外一個(gè)變量的對(duì)應(yīng)屬性值。
而大多數(shù)實(shí)際項(xiàng)目中,我們想要的結(jié)果是兩個(gè)變量(初始值相同)互不影響。所以就要使用到拷貝(分為深淺兩種)深淺拷貝的區(qū)別
淺拷貝只復(fù)制一層對(duì)象的屬性,而深拷貝則遞歸復(fù)制了所有層級(jí)。淺拷貝
淺拷貝有效性針對(duì)的是單一層級(jí)對(duì)象 [1,2,3]或者{a:1,b:2}
深拷貝有效性針對(duì)的是單層或者多層級(jí)對(duì)象 [1,2,3]或者{a:1,b:2}或者[1,[1],{a:1}]或者{a:[1],b:{c:2}}
如何實(shí)現(xiàn)
// 數(shù)組 let a = [1,2] let b = a.slice() // {} let e = {a:[1],b:{d:1},2} let f = Object.create(e) function shallowCopy (obj) { if (typeof obj === "object" && obj !== null) { if (Array.isArray(obj)) { return obj.slice() } else { let result = {} Object.keys(obj).forEach((item,i) = > { console.log(i) result[item] = obj[item] }) return result } } else { return obj } }
應(yīng)用場(chǎng)景
對(duì)于一層結(jié)構(gòu)的Array和Object想要拷貝一個(gè)副本時(shí)使用
vue的mixin是淺拷貝的一種復(fù)雜型式
如何實(shí)現(xiàn)
// 利用JSON(它能正確處理的對(duì)象是Number, String, Boolean, Array, 扁平對(duì)象) let g = JSON.parse(JSON.stringify(obj)) // 適用于 function deepCopy (obj) { if (typeof obj === "object" && obj !== null) { let objKeys = Object.keys(obj) let result if (Array.isArray(obj)) { result = [] } else { if (obj.constructor === Object) { result = {} } else { return obj } } objKeys.forEach((item) => { if (typeof obj[item] === "object" && obj[item] !== null) { switch (obj[item].constructor) { case Array: result[item] = deepCopy(obj[item]) break case Object: result[item] = deepCopy(obj[item]) break case Date: result[item] = new Date(obj[item]) break case RegExp: let attributes = "" attributes += obj[item].global ? "g" : "" attributes += obj[item].ignoreCase ? "g" : "" attributes += obj[item].multiline ? "g" : "" result[item] = new RegExp(obj[item].source, attributes); break default: result[item] = obj[item] break } } else { result[item] = obj[item] } }) return result } else { return obj } }
應(yīng)用場(chǎng)景
復(fù)制深層次的object數(shù)據(jù)結(jié)構(gòu)
對(duì)深拷貝的應(yīng)用想法
在實(shí)際工作中是不是用繼承來(lái)實(shí)現(xiàn)更好?需要大家來(lái)討論,提意見(jiàn)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/51965.html
摘要:而大多數(shù)實(shí)際項(xiàng)目中,我們想要的結(jié)果是兩個(gè)變量初始值相同互不影響。所以就要使用到拷貝分為深淺兩種深淺拷貝的區(qū)別淺拷貝只復(fù)制一層對(duì)象的屬性,而深拷貝則遞歸復(fù)制了所有層級(jí)。 為什么會(huì)用到淺拷貝和深拷貝 首先來(lái)看一下如下代碼 let a = b = 2 a = 3 console.log(a) console.log(b) let c = d = [1,2,3] let e = f = {a:...
摘要:而大多數(shù)實(shí)際項(xiàng)目中,我們想要的結(jié)果是兩個(gè)變量初始值相同互不影響。所以就要使用到拷貝分為深淺兩種深淺拷貝的區(qū)別淺拷貝只復(fù)制一層對(duì)象的屬性,而深拷貝則遞歸復(fù)制了所有層級(jí)。 為什么會(huì)用到淺拷貝和深拷貝 首先來(lái)看一下如下代碼 let a = b = 2 a = 3 console.log(a) console.log(b) let c = d = [1,2,3] let e = f = {a:...
摘要:在中可以通過(guò)添加一個(gè)參數(shù)來(lái)實(shí)現(xiàn)遞歸,調(diào)用就可以實(shí)現(xiàn)一個(gè)深拷貝。利用序列化實(shí)現(xiàn)一個(gè)深拷貝 在JavaScript中,對(duì)于Object和Array這類(lèi)引用類(lèi)型值,當(dāng)從一個(gè)變量向另一個(gè)變量復(fù)制引用類(lèi)型值時(shí),這個(gè)值的副本其實(shí)是一個(gè)指針,兩個(gè)變量指向同一個(gè)堆對(duì)象,改變其中一個(gè)變量,另一個(gè)也會(huì)受到影響。 這種拷貝分為兩種情況:拷貝引用和拷貝實(shí)例,也就是我們說(shuō)的淺拷貝和深拷貝 淺拷貝(shallow...
摘要:淺拷貝和淺拷貝的問(wèn)題,不僅在日常應(yīng)用中需要注意,而且在面試和筆試中也常被用來(lái)考察應(yīng)聘者,屬于文體兩開(kāi)花的?;緮?shù)據(jù)類(lèi)型引用數(shù)據(jù)類(lèi)型等等基本數(shù)據(jù)類(lèi)型是按值訪問(wèn)的,對(duì)其的拷貝會(huì)直接復(fù)制其值保存在新變量中。方法手工遍歷法方法方法方法方法 淺拷貝和淺拷貝的問(wèn)題,不僅在日常應(yīng)用中需要注意,而且在面試和筆試中也常被用來(lái)考察應(yīng)聘者,屬于文體兩開(kāi)花的points。 什么是深拷貝和淺拷貝呢? 名稱(chēng) ...
閱讀 990·2021-10-25 09:48
閱讀 691·2021-08-23 09:45
閱讀 2548·2019-08-30 15:53
閱讀 1803·2019-08-30 12:45
閱讀 729·2019-08-29 17:21
閱讀 3543·2019-08-27 10:56
閱讀 2605·2019-08-26 13:48
閱讀 752·2019-08-26 12:24