怎么實現(xiàn)深拷貝

  1. 注意點
  • 進行拷貝操作時,須加以區(qū)分引用類型和基本數(shù)據(jù)類型的值,且拷貝引用類型的值時,不是簡簡單單的復制其保存在棧中的指針,(即淺拷貝)而是應(yīng)該復制其存儲在堆中的數(shù)據(jù)。
  1. 解題思路
    (1)方法一:分別對數(shù)組、對象、基本數(shù)據(jù)類型值進行判斷、考慮,使用遞歸的方式復制值
    (2)方法二:利用了 JSON.parse()JSON.stringify() 這兩個方法實現(xiàn)深拷貝

  2. 代碼

/* 方法一 */
function deepClone (val) {
  var res;
  if (val && Array.isArray(val)) {
    res = [];
    val.forEach(function (item) {
      res.push(deepClone(item));
    });
  } else if (typeof val === 'object' && val !== null) {
    res = {};
    for (let key of Object.keys(val)) {
      res[key] = deepClone(val[key]);
    }
  } else {
    res = val;
  }
  return res;
}

/* 方法二 */
function deepClone (val) {
  if (typeof val === 'undefined') {
    return;
  }
  var temp = JSON.stringify(val);
  return JSON.parse(temp);
}

/* 測試代碼 */
// 深拷貝基本數(shù)據(jù)類型值
var val = 'hello world';
console.log('基本數(shù)據(jù)類型值', deepClone(val));
// 深拷貝數(shù)組
var arr = [9, 'cat', true, null, undefined, [1, 2], {foo: 'bar'}];
console.log('數(shù)組', deepClone(arr));
// 深拷貝對象
var obj = {
  name: 'wang',
  age: 18,
  isStudent: true,
  nums: [3, 4],
  score: {
    math: 95
  }
};
console.log('對象', deepClone(obj));
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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