摘要:說(shuō)明外層數(shù)組拷貝的是實(shí)例說(shuō)明元素拷貝是引用深拷貝在堆中重新分配內(nèi)存,并且把源對(duì)象所有屬性都進(jìn)行新建拷貝,拷貝后的對(duì)象與原來(lái)的對(duì)象完全隔離,互不影響。中的方法可以實(shí)現(xiàn)深拷貝,源碼原理也是遞歸使用淺拷貝。
1.淺拷貝
當(dāng)把數(shù)組或?qū)ο蠛?jiǎn)單賦值給其他變量的時(shí)候,實(shí)際上進(jìn)行的是淺拷貝,淺拷貝是拷貝引用,只是將拷貝后的引用指向同一個(gè)對(duì)象實(shí)例,彼此間的操作還會(huì)互相影響。
分為兩種情況:
直接拷貝源對(duì)象的引用
var a = { c : 1}; var b = a ; console.log( a === b); // true a.c = 2 ; console.log( b.c ); // 2
源對(duì)象拷貝實(shí)例,但其屬性拷貝引用。
var a = [{ c:1 },{d:2} ]; var b = a.slice( ); console.log( a === b ); // false 說(shuō)明外層數(shù)組拷貝的是實(shí)例 a[0].c = 3; console.log( b[0].c ); // 3 //說(shuō)明元素拷貝是引用
2.深拷貝
在堆中重新分配內(nèi)存,并且把源對(duì)象所有屬性都進(jìn)行新建拷貝,拷貝后的對(duì)象與原來(lái)的對(duì)象完全隔離,互不影響。
如何實(shí)現(xiàn)深拷貝?只要遞歸調(diào)用“淺拷貝”就行了。
function deepCopy( p , c ){ var c = c || {} ; for(var i in p){ If( typeof p[ i ] === “object” ){ c[ i ] = ( p[ i ].constructor === Array )? [ ] : { }; deepCopy(p[ i ], c[ i ]); }else{ c[ i ] = p[ i ]; } } return c; }
jquery中的$.extend( )方法可以實(shí)現(xiàn)深拷貝,源碼原理也是遞歸使用淺拷貝。
注意ES6的新方法Object.assign( target , obj )實(shí)現(xiàn)的是淺拷貝。
3.javascript判斷對(duì)象是否相等 “==“ ,”==="
對(duì)象和數(shù)組這種復(fù)雜數(shù)據(jù)類(lèi)型在判斷是否相等時(shí),判斷的是二者指向的內(nèi)存地址是否一致,并不是以是否有相同的屬性,屬性是否有相同的值為標(biāo)準(zhǔn)。
如,
var obj1 = {name : ‘Mack’, age : 21}; var obj2 = {name : ‘Mack’, age : 21}; console.log(obj1 === obj2); //false var obj3 = obj1; console.log(obj1 === obj3); //true
ES6中的Object.is( )在復(fù)雜數(shù)據(jù)類(lèi)型的判斷機(jī)制上和 ‘===’ 是一樣的(不同之處只有兩個(gè),一個(gè)是 +0和-0,第二個(gè)是NaN和其本身)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/88336.html
摘要:在中可以通過(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) ...
摘要:拷貝分為淺拷貝和深拷貝。淺拷貝是引用復(fù)制,深拷貝是完全單純拷貝數(shù)據(jù)的值。所以,這種方法只是簡(jiǎn)單繞過(guò)第一層箱子的引用復(fù)制深拷貝目前比較好的方法就是大法,要么就是自己寫(xiě)遞歸的深拷貝函數(shù)。附帶深拷貝的自定義函數(shù)源自大佬的 經(jīng)常遇到數(shù)組或?qū)ο蟮纫妙?lèi)型作為函數(shù)的參數(shù)的情況,但又不想修改原來(lái)的數(shù)據(jù),這時(shí)候就需要拷貝(基本類(lèi)型的變量不需要考慮)??截惙譃闇\拷貝和深拷貝。淺拷貝是引用復(fù)制,深拷貝是完...
摘要:而大多數(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:...
閱讀 2114·2021-11-11 16:55
閱讀 3183·2021-10-11 10:58
閱讀 3061·2021-09-13 10:28
閱讀 3997·2021-07-26 23:57
閱讀 1044·2019-08-30 15:56
閱讀 1341·2019-08-29 13:15
閱讀 1278·2019-08-26 18:18
閱讀 1284·2019-08-26 13:44