<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      JavaScript深淺拷貝

      基本類型 & 引用類型

      ECMAScript中的數據類型可分為兩種:

      • 基本類型:undefined,null,Boolean,String,Number,Symbol
      • 引用類型:Object,Array,Date,Function,RegExp等

      不同類型的存儲方式:

      • 基本類型:基本類型值在內存中占據固定大小,保存在棧內存
      • 引用類型:引用類型的值是對象,保存在堆內存中,而棧內存存儲的是對象的變量標識符以及對象在堆內存中的存儲地址

      不同類型的復制方式:

      • 基本類型:從一個變量向另外一個新變量復制基本類型的值,會創建這個值的一個副本,并將該副本復制給新變量
      let foo = 1;
      let bar = foo;
      console.log(foo === bar); // -> true
      
      // 修改foo變量的值并不會影響bar變量的值
      let foo = 233;
      console.log(foo); // -> 233
      console.log(bar); // -> 1
      復制代碼
      • 引用類型:從一個變量向另一個新變量復制引用類型的值,其實復制的是指針,最終兩個變量最終都指向同一個對象
      let foo = {
        name: 'leeper',
        age: 20
      }
      let bar = foo;
      console.log(foo === bar); // -> true
      
      // 改變foo變量的值會影響bar變量的值
      foo.age = 19;
      console.log(foo); // -> {name: 'leeper', age: 19}
      console.log(bar); // -> {name: 'leeper', age: 19}
      復制代碼

      深拷貝 & 淺拷貝

      • 淺拷貝:僅僅是復制了引用,彼此之間的操作會互相影響
      • 深拷貝:在堆中重新分配內存,不同的地址,相同的值,互不影響

      總的來說,深淺拷貝的主要區別就是:復制的是引用還是復制的是實例

      深淺拷貝的實現

      看一看原生JavaScript中提供的一些復制方法究竟是深拷貝還是淺拷貝以及動手實現深拷貝。

      淺拷貝

      • Array.prototype.slice()
      let a = [1, 2, 3, 4];
      let b = a.slice();
      console.log(a === b); // -> false
      
      a[0] = 5;
      console.log(a); // -> [5, 2, 3, 4]
      console.log(b); // -> [1, 2, 3, 4]
      復制代碼
      • Array.prototype.concat()
      let a = [1, 2, 3, 4];
      let b = a.concat();
      console.log(a === b); // -> false
      
      a[0] = 5;
      console.log(a); // -> [5, 2, 3, 4]
      console.log(b); // -> [1, 2, 3, 4]
      復制代碼

      看起來Array的slice(),concat()似乎是深拷貝,再接著看就知道它們究竟是深拷貝還是淺拷貝:

      let a = [[1, 2], 3, 4];
      let b = a.slice();
      console.log(a === b); // -> false
      
      a[0][0] = 0;
      console.log(a); // -> [[0, 2], 3, 4]
      console.log(b); // -> [[0, 2], 3, 4]
      復制代碼

       

      slice()

       

      同樣,對于concat()也進行驗證:

      let a = [[1, 2], 3, 4];
      let b = a.concat();
      console.log(a === b); // -> false
      
      a[0][0] = 0;
      console.log(a); // -> [[0, 2], 3, 4]
      console.log(b); // -> [[0, 2], 3, 4]
      復制代碼

      綜上, Array的slice和concat方法并不是真正的深拷貝,對于Array的第一層的元素是深拷貝,而Array的第二層 slice和concat方法是復制引用。所以,Array的slice和concat方法都是淺拷貝

      深拷貝

      • JSON.parse()和JSON.stringify()
      1. JSON.stringify():把一個js對象序列化為一個JSON字符串
      2. JSON.parse():把JSON字符串反序列化為一個js對象
      let obj = {
        name: 'leeper',
        age: 20,
        friend: {
          name: 'lee',
          age: 19
        }
      };
      let copyObj = JSON.parse(JSON.stringify(obj));
      obj.name = 'Sandman';
      obj.friend.name = 'Jerry';
      console.log(obj);
      // -> {name: "Sandman", age: 20, friend: {age: 19,name: 'Jerry'}}
      console.log(copyObj);
      // -> {name: "leeper", age: 20, friend: {age: 19,name: 'lee'}}
      復制代碼

       

      deep copy

       

      綜上,JSON.parse()和JSON.stringify()是完全的深拷貝。

      • 動手實現深拷貝 利用遞歸來實現對對象或數組的深拷貝。遞歸思路:對屬性中所有引用類型的值進行遍歷,直到是基本類型值為止。
      function deepCopy(obj) {
        if (!obj && typeof obj !== 'object') {
          throw new Error('error arguments');
        }
        // const targetObj = obj.constructor === Array ? [] : {};
        const targetObj = Array.isArray(obj) ? [] : {};
        for (let key in obj) {
          
          //只對對象自有屬性進行拷貝
          if (obj.hasOwnProperty(key)) {
            if (obj[key] && typeof obj[key] === 'object') {
              targetObj[key] = deepCopy(obj[key]);
            } else {
              targetObj[key] = obj[key];
            }
          }
        }
        return targetObj;
      }

      原文鏈接:https://juejin.cn/post/6844903608010407944

      posted @ 2022-12-05 15:18  小餓爽  閱讀(21)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 免费看欧美日韩一区二区三区| 国产午夜福利免费入口| 日韩人妻少妇一区二区三区| 亚洲高清日韩专区精品| 亚洲精品乱码久久观看网| 国产成人亚洲欧美二区综合| 海兴县| 国内精品久久久久久久coent| 美女一区二区三区亚洲麻豆| 亚洲欧美人成人让影院| 亚洲人成电影在线天堂色| 亚洲AV无码秘?蜜桃蘑菇| 亚洲AV日韩AV永久无码下载| 亚洲av无码之国产精品网址蜜芽| 国产肥妇一区二区熟女精品| 高清有码国产一区二区| 国产精品久久久久久福利69堂| WWW丫丫国产成人精品| 91九色国产成人久久精品| 亚洲精品日韩在线丰满| 国内精品久久人妻无码不卡| 这里只有精品免费视频| 日本中文字幕亚洲乱码| 修水县| 国产乱码日韩亚洲精品成人| 亚洲一区二区偷拍精品| 777天堂麻豆爱综合视频| 97一期涩涩97片久久久久久久| 国产亚洲一区二区三区av| 日本一卡2卡3卡四卡精品网站| 精品国产欧美一区二区三区在线 | 97se亚洲国产综合在线| 国产不卡一区二区四区| 亚洲成a人片在线观看久| 日韩福利视频导航| 色欲AV无码一区二区人妻| 国产强奷在线播放免费| 国产偷窥厕所一区二区| 国产不卡一区二区在线| 91精品国产色综合久久| 亚洲欧美中文字幕日韩一区二区|