賦值、淺拷貝和深拷貝

ECMAScript的數(shù)據(jù)類型

基本數(shù)據(jù)類型

  • 基本數(shù)據(jù)類型主要是:undefined,boolean,number,string,null,symbol

  • 基本數(shù)據(jù)類型以名值存儲在棧中

    let a = 1
    let b = a
    
    

    執(zhí)行第一個語句之后,棧是這樣的

    avatar

    執(zhí)行第二個語句,就變成這樣了

    avatar

    此時如果修改a的值,對b不會造成任何影響

引用數(shù)據(jù)類型的存儲

  • 包括:對象、數(shù)組、函數(shù)等

  • 引用類型存儲在堆中

    let person1 = {}
    let person2 = {}
    
    
    avatar
    let a = [1,2,3]
    let b = a
    
    
    avatar

    引用類型的賦值就是將a的引用給b,兩者指向同一塊內(nèi)存,兩者的操作會互相影響

    a[1] = 5
    console.log(b[1])   //5
    console.log(a === b)  //true
    
    

賦值和淺拷貝的區(qū)別

  • 賦值:簡單地把變量的引用給目標變量

  • 淺拷貝:把對象的一級屬性拷貝給另一個對象,但不包括子對象

  • 舉個栗子:

    let a=[0,1,[2,3],4],
            b=a.slice(); //slice方法是實現(xiàn)淺拷貝的一種方式
    
    a[0]=1;
    a[2][0]=1;
    console.log(a,b);
    
    
    avatar

深拷貝的方法

  • 深拷貝:把一個對象的所有子對象都拷貝給另一個對象,兩個對象之間互不影響

  • 常用方法:

    • 可以用遞歸的方法

    • 用jQuery的extend方法

    • 用json對象

      function deepClone2(obj) {
        var _obj = JSON.stringify(obj),
          objClone = JSON.parse(_obj);
        return objClone;
      }
      
      
參考資料

https://juejin.im/post/59ac1c4ef265da248e75892b

https://www.cnblogs.com/echolun/p/7889848.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容