深拷贝实现

210 阅读1分钟

深拷贝实现有好几种,主要说一下JSON.parse(JSON.stringify()):

JSON.stringify():默认情况下输出的json字符串不包含任何空格字符串或者缩进
JSON.parse():把json字符串解析为原生的js值

Json.parse(JSON.stringify())实现深拷贝的原理:

利用 JSON.stringify()将js对象序列化(json字符串),在使用json.parse()来反序列化(还原)js对
象(序列化的作用是存储与传输)

使用他的时候要注意以下情况:

1.json里如果有时间对象的话,会被转为String类型的
2.参数名有regexp,error的会返回空
3.有方法的方法会丢失
4.undefined的也会丢失
4.如果数据是NAN,Infinity的会被变成null
5.如果数据是构造函数的话,序列化后则会丢失对象constructor
6.数据对象存在循环引用,也无法实现深拷贝

jq实现深拷贝:

 1. let a = []
    b = a.slice()
 这种实现的话如果a里的数据有数组是无法实现深拷贝的
 
 2.let a=[0,1,[2,3],4],
   b=$.extend(true,[],a);
   a[0]=1;
   a[2][0]=1;
   console.log(a,b);
  需要依赖jq
  

递归方法实现深拷贝

function deepClone(obj){
  let objClone = Array.isArray(obj)?[]:{};
  if(obj && typeof obj==="object"){
    for(key in obj){
        if(obj.hasOwnProperty(key)){
            //判断ojb子元素是否为对象,如果是,递归复制
            if(obj[key]&&typeof obj[key] ==="object"){
                objClone[key] = deepClone(obj[key]);
            }else{
                //如果不是,简单复制
                objClone[key] = obj[key];
              }
          }
      }
    }
    return objClone;
  }    
   let a=[1,2,3,4],
   b=deepClone(a);
   a[0]=2;
   console.log(a,b);
   (非最佳)