JS基础——深浅拷贝

来源:互联网 发布:淘客群管软件 编辑:程序博客网 时间:2024/06/08 04:15

js的数据类型分为基本数据类型和引用数据类型,而只有后者存在深拷贝。

方法一

借用JSON.parse和JSON.stringify实现

const oldArr= [1, 2];
const newArr= JSON.parse(JSON.stringify(oldArr));
newArr.push(3);
console.log(oldArr); // [1, 2]
console.log(newArr); // [1, 2, 3]

但是,undefined、function、symbol 会在转换过程中被忽略,所以这些情况下不适用这种方法。

方法二

递归的思想就是对每一层的数据都实现一次 创建对象->对象赋值 的操作

function deepClone(source){  const targetObj = source.constructor === Array ? [] : {}; // 判断复制的目标是数组还是对象  for(let keys in source){ // 遍历目标    if(source.hasOwnProperty(keys)){      if(source[keys] && typeof source[keys] === 'object'){ // 如果值是对象,就递归一下        targetObj[keys] = source[keys].constructor === Array ? [] : {};        targetObj[keys] = deepClone(source[keys]);      }else{ // 如果不是,就直接赋值        targetObj[keys] = source[keys];      }    }   }  return targetObj;}

方法三

用数组和对象自带方法实现的都是首层深拷贝(concat, slice & Object.assign(), …)

参考链接内容