js深淺拷貝

所謂的深淺拷貝是相對與typeof === 'object' 而言的,數(shù)組是用堆對應保存的。
淺拷貝:拷貝了對象的存放地址,只是指向相同而已 (只解決了第一層,對象中還有對象就不適用了)
深拷貝:完全復制了一個獨立的個體

1、 淺拷貝 (指向同一個存放地址)

 let arr1 = [1,3,5];
 let arr2 = arr1;
 arr1[0] = 10;
 console.log(arr2) // [10,3,5]

2、深拷貝

  • 2.1 返回新數(shù)組方法 slice() 、 contat()、 map()
  let arr1 = [2,5,7];
  let arr2 = arr1.slice(0);
  let arr3 = arr1.contat();
  let arr4 = arr1.map(x => x);
  arr2[0] = 4;
 arr1[0] = 99;
console.log(arr1,arr2) // [99,5,7]  [4,5,7] 
  • 2.2 ES6擴展運算符實現(xiàn)數(shù)組的深拷貝
 let arr = [1,3,5];
 let arr1 = [...arr];
  • 2.3 for-in連原型鏈也一并復制的方法
 let arr = [1,3,5];
 let arr2 = [] ;
 for(var key in arr) {
  arr2[key] = arr[key]
}
  • 2.4 使用數(shù)組遍歷賦值
  let arr = [1,2,4];
  let arr2 = [];
 arr.foreach((ele,index) =>{
   arr2[index] = ele;
 })
  • 2.5 多維數(shù)組復制
 let arr = [1,[1,4],5,[{name:'bobo'}]];
let arr2 =  JSON.parse(JSON.stringify(arr));
console.log(arr2)  //  [1,[1,4],5,[{name:'bobo'}]]

總結(jié)了這么多方法實現(xiàn)深拷貝,下面總結(jié)一個完整的深拷貝的實現(xiàn)方法

 DeepCopy (obj) {
    let str;
    let newobj;
    if (typeof obj !== 'object') {
      return obj;
    } else if (window.JSON) {
      str = JSON.stringify(obj);
      newobj = JSON.parse(str);
    } else {
      newobj = obj.constructor === Array ? [] : {};
      for (var i in obj) {
        newobj[i] = typeof obj[i] === 'object' ? this.DeepCopy(obj[i]) : obj[i];
      }
    }
    return newobj;
  },
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,136評論 1 32
  • 項目中,一般會用loadsh庫,地址:https://github.com/lodash/lodash 淺拷貝方法...
    MacXin閱讀 173評論 0 0
  • 淺拷貝 是 把對象或者數(shù)組的第一層 key 或者 索引 賦到 新的 對象或者對象上 深拷貝是迭代淺拷貝的操作,也就...
    夏目祐太閱讀 236評論 0 0
  • 深拷貝和淺拷貝(Shallow copy 和 Deep copy) 一.概念定義 對象復制有兩種:淺拷貝和深拷貝。...
    鐵頭娃_e245閱讀 867評論 0 3
  • 暑假對于每個小朋友來說,多么美好的假期,可以盡情放松自己,但是我們的小星星們依然堅持在炎炎夏日里閱讀美好! 包軒銘...
    夢緣_0675閱讀 632評論 0 0