简单深拷贝

auserroot auserroot     2022-12-10     104

关键词:

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对象简单深拷贝

functiondeepClone(obj1,obj2){varobj2=obj2||{};//最初的时候给它一个初始值=它自己或者是一个jsonfor(varnameinobj1){if(typeofobj1[name]==="object"){//先判断一下obj[name]是不是一个对象obj2[name]=(obj1[name].constructor===Array)?[]:{};//我 查看详情

javascript递归简单实现个对象深拷贝(代码片段)

...全拷贝了得自己便利写 最近在项目中需要深拷贝自己简单封了个方法 话不多说直接上码1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metaname="viewport"con 查看详情

简单实现深拷贝工具函数(代码片段)

consttype=obj=>vartoString=Object.prototype.toString;varmap=‘[objectArray]‘:‘array,‘[objectObject]‘:‘object‘returnmap[toString.call(obj)]cosntdeepClone=data=>vart=type(data)vari;varo;varlen 查看详情

对象拷贝-深拷贝

1packagecom.yj.fenghao.clone;2//深拷贝的简单测试3importjava.util.Date;45publicclassEmployeeimplementsCloneable{67privateStringname;8privateStringage;9privateStringsalary;10privateStringcareer;11privateDatedat 查看详情

js深拷贝与浅拷贝的区别,实现深拷贝的几种方法

如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果A没变,那就是深拷贝,自食其力。此篇文章中也会简单阐述到栈堆,基本数据类... 查看详情

深拷贝与浅拷贝的区别,实现深拷贝的几种方法(代码片段)

...nblogs.com/echolun/p/7889848.html 如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。此篇文章中也会... 查看详情

深拷贝和浅拷贝(代码片段)

对于普通类型的对象来说,它们之间的复制是很简单的,例如:inta=88;intb=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。 #include<iostream>usingnamespa... 查看详情

c++——浅拷贝深拷贝(代码片段)

这篇blog只是做一个简单的记录,让自己看到这个程序时有一个简单的理解过程,不做任何画图讲解#include<iostream>usingnamespacestd;//前置声明classstring;//计数器classstring_repfriendclassString;public://构造函数explicitstring_rep(constcha... 查看详情

深拷贝与浅拷贝

-------------------siwuxie095                  深拷贝 与 浅拷贝     对象间的拷贝没那么简单,大致分为两种情况:一 查看详情

qimage的浅拷贝与深拷贝

 首先简单说说什么是浅拷贝和深拷贝:浅拷贝就比如像引用类型,而深拷贝就比如值类型,即浅拷贝是共用一块内存的,而深拷贝是复制一份内容。  我们再来看看QImage类的几个构造函数://浅拷贝QImage(uchar*data,intwidt... 查看详情

c++的深拷贝与浅拷贝

对于普通类型的对象来说,它们之间的复制是很简单的,例如:inta=88;intb=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。       ... 查看详情

js深拷贝与浅拷贝

如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。functiondeepClone(obj){letobjClone=Array.isArray(obj)?[]:{};... 查看详情

深拷贝与浅拷贝

...员逐一赋值。若类中含有指针类型的数据,这种方式只是简单的把指针的指向赋值给新成员,但并没有给新成员分配内存,因此这种方式必然会导致错误。为了解决浅拷贝出现的错误,必须显示的定义一个拷贝构造函数,使之不... 查看详情

浅拷贝深拷贝

...量互相赋值那么问题来了,如果是普通的赋值其实也就是简单的浅拷贝数据,浅拷贝容易被影响数据,深拷贝则不一样。 以下一个小例子: 为什么b数组删除一个下标,a数组也会被影响呢? 这里就涉及到浅拷贝、深... 查看详情

javascript中的深拷贝和浅拷贝

...boolean、string、number。变量是按值存放的,存放在栈中的简单数据段,可以直接访问。 (2)、引用类型  引用类型包括对象和数组,其 查看详情

深拷贝和浅拷贝的区别(代码片段)

...别在于是否真正获取一个对象的复制实体,和不是引用。简单来说浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的... 查看详情

深拷贝与浅拷贝

简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存(eg:客户端改变数据时,改变的是已经存在的内存中的数据也就是后台数据),而深拷贝就是增加一个指针并且申请一个新的内存,使这个增... 查看详情

对象的扩展运算符(...)深拷贝还是浅拷贝

1、如果只是一层数组或是对象,其元素只是简单类型的元素,那么属于深拷贝(就是一层拷贝,暂时就理解为深拷贝吧!!!!)letaa={age:18,name:'aaa'}letbb={...aa};bb.age=22;console.log(aa.age);//182、如果数组或对象中的元素是引用类型的... 查看详情