首页 > 其他分享 >深拷贝、浅拷贝

深拷贝、浅拷贝

时间:2023-01-09 09:11:06浏览次数:24  
标签:obj1 obj2 console log let 拷贝

深浅拷贝:

内存中一共分为栈内存和堆内存两大区域,所谓深浅拷贝主要是对js引用类型数据进行拷贝一份;浅拷贝就是引用类型数据赋值之后,例obj1=obj2 如果后面的操作中修改obj1对象obj2也会改变,因为在内存中引用数据类型,名字存在栈内存中,值存在堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值,两个引用类型数据地址一样,如果其中一个发生变化另外一个会有影响;而深拷贝则不会,深拷贝是会在堆内存中重新开辟一块空间进行存放。

简单来说就是B复制了A,如果A发生了改变,如果B随之变化,那么是浅拷贝,如果B并没有发生变化,则是深拷贝。

1.如果是基本数据类型,名字和值都会储存在栈内存中

 let a = 1;  let b = a; // 栈内存会开辟一个新的内存空间,此时b和a都是相互独立的  b = 2;  console.log(a); //输出a为1  console.log(b);  //输出b为2   2.浅拷贝实现方式 (1)用=赋值  let a = [1, 2, 3]  let b = a;  a[0] = 0;  console.log('a', a);  console.log('b', b); 运行结果   (2)用Object.assign方法  let obj1 = {             a: 1,             b: 2         }  let obj2 = Object.assign(obj1);  obj2.a = 3;  console.log('obj1', obj1)  console.log('obj2', obj2) 运行结果

 

3.深拷贝实现方式

(1)JSON做字符串转换

 let a = [1, 2, 3];  let b = JSON.parse(JSON.stringify(a));  b[0] = 0;  console.log("a", a);  console.log("b", b);  运行结果  

(2)手动实现深拷贝

 let obj1 = {             a: 1,             b: 2         }  let obj2 = {             a: obj1.a,             b: obj1.b         }   obj2.a = 3;   console.log('obj1', obj1)   console.log('obj2', obj2) 运行结果

 

 (3)用递归去拷贝所有层级属性

  const deepClone = (obj) => {             let objClone = Array.isArray(obj) ? [] : {};             if (obj && typeof obj === "object") {                 for (key in obj) {                     //判断obj子元素是否为对象,如果是,递归复制                     if (obj[key] && typeof obj[key] === "object") {                         objClone[key] = deepClone(obj[key]);                     } else {                         //如果不是,简单复制                         objClone[key] = obj[key];                     }                 }             }             return objClone;         }     let a = [1, 2, 3];   let b = deepClone(a);   b[0] = 0;   console.log("a", a);   console.log("b", b);   运行结果        let obj1 = {             a: 1,             b: 2,             c: {                 d: 3             }         }    let obj2 = deepClone(obj1);    obj2.a = 3;    obj2.c.d = 4;    console.log("obj1", obj1)    console.log("obj2", obj2);    运行结果

  

 

标签:obj1,obj2,console,log,let,拷贝
From: https://www.cnblogs.com/xiao-wo-niu/p/17021479.html

相关文章

  • Python深浅拷贝的理解
    1.拷贝拷贝实际上其实就是在赋值,比如我们有一个列表L1,定义另一个列表L2引用列表L1,实际上就是在拷贝列表L1的值,由于由于L1列表是可变的数据类型,所以当L1的值变的时候,L2的值......
  • 深拷贝和浅拷贝的实现方法
    深拷贝1://循环递归法1functionisObject(obj){return(typeofobj==='object'||typeofobj==='function')&&obj!==null}//迭代递归法:深拷贝对象......
  • 【Android OpenCV】Visual Studio 创建支持 OpenCV 库的 CMake 工程 ③ ( CMake 工程
    文章目录​​一、CMake工程中配置OpenCV库文件​​​​二、拷贝OpenCV库文件​​​​三、测试OpenCV​​一、CMake工程中配置OpenCV库文件在上一篇博客​​【An......
  • 浅拷贝问题
    (53条消息)ArrayList的add方法,浅拷贝_oxygen-hhh的博客-CSDN博客描述:  //接收大集合参数,返回小集合结果  publicstaticArrayList<List<String>>smallList(L......
  • C++:深拷贝和浅拷贝
    1.什么是浅拷贝和深拷贝对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存。例如:classBase{public:Base():m_a(0),m_b(0){}Base......
  • 浅拷贝与深拷贝
    相互关联用浅拷贝,不关联就用深拷贝。深拷贝和浅拷贝是指在赋值一个对象时,拷贝的深度不同。在进行深拷贝时,会拷贝所有的属性,并且如果这些属性是对象,也会对这些对象进行深......
  • C++:拷贝构造函数
    1.拷贝和拷贝构造函数拷贝和复制是一个意思,对应的英文单词都是copy。对于计算机来说,拷贝是指用一份原有的、已经存在的数据创建出一份新的数据,最终的结果是多了一份相同......
  • vue2 lodash函数27 节流的函数、防抖的函数、操作数组的一系列函数、操作对象的一
    App.vue<keep-aliveinclude="Home"><router-view/></keep-alive>routerindex.jsimportVuefrom'vue'importVueRouterfrom'vue-router'importH......
  • JavaScript 深拷贝
    在进行赋值之前,为指针类型的数据成员另辟了一个独立的内存空间,实现真正内容上的拷贝。这种拷贝称为深拷贝。————百度百科源码⚠还有部分类型不支持typescript:/......
  • 深度克隆(深拷贝)
    深度克隆(深拷贝)exportconstdeepClone=(targetObj)=>{returnnewPromise(resolve=>{const{port1,port2}=newMessageChannel();port1.postMe......