js 浅拷贝 深拷贝

本文详细介绍了JavaScript中的浅拷贝和深拷贝概念,通过实例展示了Object.assign()方法进行浅拷贝以及如何实现深拷贝。浅拷贝只复制对象的第一层,深层数据仍然共享引用,而深拷贝则会递归复制所有层级的数据,确保独立。文中还提供了自定义深拷贝函数的实现方式,并讨论了不同数据类型在拷贝过程中的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念
浅拷贝
只把复杂类型数据的第一层做复制操作,深层次数据依然会相互影响
Object.assign( 新对象, 老对象)
把老对象第一层的数据拷贝一份给新对象,深层次的数据新、老对象依然会相互影响

深拷贝
把复杂类型数据中包含的所有数据都做复制操作,赋值之后不会相互影响

浅拷贝
如果是简单数据类型,改变值,另一个不会变,
如果是复杂数据类型,它是一个对象或者数组,里面存储空间是通过它的地址(在一个空间里),如果更改值,另外一个也会改变

   // 浅拷贝只拷贝一层,更深层次对象级别的只拷贝引用
   
   // 深拷贝拷贝多层,每一级别的数据都会拷贝
        var obj = {
            id: "1",//简单数据类型
            name: "andy", //简单数据类型
            msg: {  //复杂数据类型
                age: 18
            }
        }
        var o = {};
        // for (var k in obj) {
        //     // k 是属性名   obj[k] 属性值
        //     o[k] = obj[k];
        // }
        // console.log(o);
        // o.msg.age = 20;
        // console.log(obj);

        console.log('----------------');
        // Object.assign('新对象','旧对象')
        Object.assign(o, obj); //语法糖
        console.log(o);
        o.msg.age = 20;
        console.log(obj);
//深拷贝
深拷贝拷贝多层,每一级别的数据都会拷贝
// 封装一个函数接收新数组和旧数组的数据
     function deepCopy(newobj, oldobj) {
         //遍历拿到旧数组的数据
        for (var k in oldobj) {
          //申明变量接收它的属性值
          var item = oldobj[k];
          // 判断下旧的属性值是不是数组
          if (item instanceof Array) {
         //如果是就把旧数组的值传入新数组
              newobj[k] = [];
             deepCopy(newobj[k], item);
         // 判断下旧的属性值是不是一个函数
      } else if (item instanceof Function) {
         //如果是就把旧函数值的值传入新的函数
              newobj[k] = item;
            // 判断下旧的属性值是不是一个对象
      }else if (item instanceof Object) {
            //如果是就把旧对象值的值传入新对象
                newobj[k] = {};
                deepCopy(newobj[k], item);
          //最后把旧的简单数据类型的值给新对象
            } else {               
                newobj[k] = item;
             }
           }
        }
         deepCopy(o, obj);
         console.log(o);

         var arr = [];
         console.log(arr instanceof Array);
         o.msg.age = 20;
        console.log(obj);
//注意 数组判断必须写到对象的前面,因为数组它也是一个对象,如果在后面,会跟对象判断重合

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值