摘要:說明外層數(shù)組拷貝的是實例說明元素拷貝是引用深拷貝在堆中重新分配內(nèi)存,并且把源對象所有屬性都進(jìn)行新建拷貝,拷貝后的對象與原來的對象完全隔離,互不影響。中的方法可以實現(xiàn)深拷貝,源碼原理也是遞歸使用淺拷貝。
1.淺拷貝
當(dāng)把數(shù)組或?qū)ο蠛唵钨x值給其他變量的時候,實際上進(jìn)行的是淺拷貝,淺拷貝是拷貝引用,只是將拷貝后的引用指向同一個對象實例,彼此間的操作還會互相影響。
分為兩種情況:
直接拷貝源對象的引用
var a = { c : 1}; var b = a ; console.log( a === b); // true a.c = 2 ; console.log( b.c ); // 2
源對象拷貝實例,但其屬性拷貝引用。
var a = [{ c:1 },{d:2} ]; var b = a.slice( ); console.log( a === b ); // false 說明外層數(shù)組拷貝的是實例 a[0].c = 3; console.log( b[0].c ); // 3 //說明元素拷貝是引用
2.深拷貝
在堆中重新分配內(nèi)存,并且把源對象所有屬性都進(jìn)行新建拷貝,拷貝后的對象與原來的對象完全隔離,互不影響。
如何實現(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( )方法可以實現(xiàn)深拷貝,源碼原理也是遞歸使用淺拷貝。
注意ES6的新方法Object.assign( target , obj )實現(xiàn)的是淺拷貝。
3.javascript判斷對象是否相等 “==“ ,”==="
對象和數(shù)組這種復(fù)雜數(shù)據(jù)類型在判斷是否相等時,判斷的是二者指向的內(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ù)類型的判斷機(jī)制上和 ‘===’ 是一樣的(不同之處只有兩個,一個是 +0和-0,第二個是NaN和其本身)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/88336.html
摘要:在中可以通過添加一個參數(shù)來實現(xiàn)遞歸,調(diào)用就可以實現(xiàn)一個深拷貝。利用序列化實現(xiàn)一個深拷貝 在JavaScript中,對于Object和Array這類引用類型值,當(dāng)從一個變量向另一個變量復(fù)制引用類型值時,這個值的副本其實是一個指針,兩個變量指向同一個堆對象,改變其中一個變量,另一個也會受到影響。 這種拷貝分為兩種情況:拷貝引用和拷貝實例,也就是我們說的淺拷貝和深拷貝 淺拷貝(shallow...
摘要:淺拷貝和淺拷貝的問題,不僅在日常應(yīng)用中需要注意,而且在面試和筆試中也常被用來考察應(yīng)聘者,屬于文體兩開花的。基本數(shù)據(jù)類型引用數(shù)據(jù)類型等等基本數(shù)據(jù)類型是按值訪問的,對其的拷貝會直接復(fù)制其值保存在新變量中。方法手工遍歷法方法方法方法方法 淺拷貝和淺拷貝的問題,不僅在日常應(yīng)用中需要注意,而且在面試和筆試中也常被用來考察應(yīng)聘者,屬于文體兩開花的points。 什么是深拷貝和淺拷貝呢? 名稱 ...
摘要:拷貝分為淺拷貝和深拷貝。淺拷貝是引用復(fù)制,深拷貝是完全單純拷貝數(shù)據(jù)的值。所以,這種方法只是簡單繞過第一層箱子的引用復(fù)制深拷貝目前比較好的方法就是大法,要么就是自己寫遞歸的深拷貝函數(shù)。附帶深拷貝的自定義函數(shù)源自大佬的 經(jīng)常遇到數(shù)組或?qū)ο蟮纫妙愋妥鳛楹瘮?shù)的參數(shù)的情況,但又不想修改原來的數(shù)據(jù),這時候就需要拷貝(基本類型的變量不需要考慮)。拷貝分為淺拷貝和深拷貝。淺拷貝是引用復(fù)制,深拷貝是完...
摘要:而大多數(shù)實際項目中,我們想要的結(jié)果是兩個變量初始值相同互不影響。所以就要使用到拷貝分為深淺兩種深淺拷貝的區(qū)別淺拷貝只復(fù)制一層對象的屬性,而深拷貝則遞歸復(fù)制了所有層級。 為什么會用到淺拷貝和深拷貝 首先來看一下如下代碼 let a = b = 2 a = 3 console.log(a) console.log(b) let c = d = [1,2,3] let e = f = {a:...
摘要:而大多數(shù)實際項目中,我們想要的結(jié)果是兩個變量初始值相同互不影響。所以就要使用到拷貝分為深淺兩種深淺拷貝的區(qū)別淺拷貝只復(fù)制一層對象的屬性,而深拷貝則遞歸復(fù)制了所有層級。 為什么會用到淺拷貝和深拷貝 首先來看一下如下代碼 let a = b = 2 a = 3 console.log(a) console.log(b) let c = d = [1,2,3] let e = f = {a:...
閱讀 2100·2021-11-11 16:55
閱讀 3171·2021-10-11 10:58
閱讀 3038·2021-09-13 10:28
閱讀 3967·2021-07-26 23:57
閱讀 1005·2019-08-30 15:56
閱讀 1331·2019-08-29 13:15
閱讀 1258·2019-08-26 18:18
閱讀 1267·2019-08-26 13:44