简单深拷贝

Posted auserroot

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单深拷贝相关的知识,希望对你有一定的参考价值。

let obj = c:1,d:()=>
    obj_ = a:1,b:2
    obj__ = a:()=>,b:()=>,c:1
    _obj = [1,2,3,1]
    _obj_= 1

// 深拷贝
// JSON.parse(JSON.stringify())
// 局限性:

// 他无法实现对函数 、RegExp等特殊对象的克隆
// 会抛弃对象的constructor,所有的构造函数会指向Object
// 对象有循环引用,会报错

 let o = JSON.parse(JSON.stringify(obj)) 

 console.log(o)//c:1

//遍历 递归
// 对数据类型做判断

const deepClone = (obj)=>
  let o =  //存结果
  //判断是否为复杂类型(引用类型)
  if(typeof obj === 'object' && obj !== null )
  //数组处理
    if(Array.isArray(obj))
       o = [...obj]
    
    //对象处理
    for(let item in obj)
      if(obj.hasOwnProperty(item))
        o[item] = deepClone(obj[item])
      else
        o = ...obj
      
    
  else
     o = obj //普通类型
  
  return o


// deepClone(obj)
console.log(deepClone(obj))// c: 1, d: [Function: d] 
console.log(deepClone(obj_))// a: 1, b: 2 
console.log(deepClone(obj__))// a: [Function: a], b: [Function: b], c: 1 
console.log(deepClone(_obj))//[ 1, 2, 3, 1 ]
console.log(deepClone(_obj_))//1

//精简
const deepClone_simple = (obj) =>
 let o = ; 
 //普通类型
 (typeof obj !== 'object' || obj === null)&&(o = obj);
 //复杂类型
 //数组
 Array.isArray(obj)&&(o = [...obj]);
 for(let item in obj)
 obj.hasOwnProperty(item)&&(o[item] = deepClone_simple(obj[item]));
 
 return o;




以上是关于简单深拷贝的主要内容,如果未能解决你的问题,请参考以下文章

js手写深拷贝的实现

js手写深拷贝的实现

什么是深拷贝和浅拷贝以及如何实现深拷贝

龙叔python-直接赋值,深拷贝,浅拷贝的简单解析

JavaScript递归简单实现个对象深拷贝

简单深拷贝