国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS中的淺拷貝和深拷貝

xeblog / 1018人閱讀

摘要:說明外層數(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

相關(guān)文章

  • JavaScript的淺拷貝和深拷貝

    摘要:在中可以通過添加一個參數(shù)來實現(xiàn)遞歸,調(diào)用就可以實現(xiàn)一個深拷貝。利用序列化實現(xiàn)一個深拷貝 在JavaScript中,對于Object和Array這類引用類型值,當(dāng)從一個變量向另一個變量復(fù)制引用類型值時,這個值的副本其實是一個指針,兩個變量指向同一個堆對象,改變其中一個變量,另一個也會受到影響。 這種拷貝分為兩種情況:拷貝引用和拷貝實例,也就是我們說的淺拷貝和深拷貝 淺拷貝(shallow...

    ernest.wang 評論0 收藏0
  • 實現(xiàn)JS的淺拷貝和深拷貝

    摘要:淺拷貝和淺拷貝的問題,不僅在日常應(yīng)用中需要注意,而且在面試和筆試中也常被用來考察應(yīng)聘者,屬于文體兩開花的。基本數(shù)據(jù)類型引用數(shù)據(jù)類型等等基本數(shù)據(jù)類型是按值訪問的,對其的拷貝會直接復(fù)制其值保存在新變量中。方法手工遍歷法方法方法方法方法 淺拷貝和淺拷貝的問題,不僅在日常應(yīng)用中需要注意,而且在面試和筆試中也常被用來考察應(yīng)聘者,屬于文體兩開花的points。 什么是深拷貝和淺拷貝呢? 名稱 ...

    huangjinnan 評論0 收藏0
  • js的淺拷貝和深拷貝

    摘要:拷貝分為淺拷貝和深拷貝。淺拷貝是引用復(fù)制,深拷貝是完全單純拷貝數(shù)據(jù)的值。所以,這種方法只是簡單繞過第一層箱子的引用復(fù)制深拷貝目前比較好的方法就是大法,要么就是自己寫遞歸的深拷貝函數(shù)。附帶深拷貝的自定義函數(shù)源自大佬的 經(jīng)常遇到數(shù)組或?qū)ο蟮纫妙愋妥鳛楹瘮?shù)的參數(shù)的情況,但又不想修改原來的數(shù)據(jù),這時候就需要拷貝(基本類型的變量不需要考慮)。拷貝分為淺拷貝和深拷貝。淺拷貝是引用復(fù)制,深拷貝是完...

    jsliang 評論0 收藏0
  • js的淺拷貝和深拷貝和應(yīng)用場景

    摘要:而大多數(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:...

    MartinDai 評論0 收藏0
  • js的淺拷貝和深拷貝和應(yīng)用場景

    摘要:而大多數(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:...

    nemo 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<