十分钟教你弄懂深浅拷贝

本文详细介绍了JavaScript中的浅拷贝和深拷贝概念,通过实例展示了它们的区别。浅拷贝仅复制对象的第一层属性,而深拷贝则递归复制所有层级的对象。文中还提供了使用`Object.assign()`作为浅拷贝的语法糖,以及自定义函数实现深拷贝的代码示例。在实际应用中,正确理解和使用这两种拷贝方式对于防止意外修改原始对象至关重要。

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

浅拷贝:

 <script>
       //浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用
       //深拷贝拷贝多层,每一级别的数据都会被拷贝

       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属性值,发现obj对象里的msg的age也随着一起改变了
       o.msg.age = 20;
       console.log("---------------");
       console.log(obj);

</script>

在这里插入图片描述
在这里插入图片描述
浅拷贝的语法糖:

Object.assign(o,obj); //把obj对象拷给o

深拷贝:

<script>
       var obj={
           id:1,
           name:'andy',
           msg:{
               age:18
           }
       };
       var o = {};
       //封装深拷贝函数
       function deepCopy(newobj,oldobj){
           for(var k in oldobj){
               //判断属性值属于哪种数据类型
               //1、获取属性值 oldobj[k]
               var item = oldobj[k];
               //2、判断这个值是否是数组
               if(item instanceof Array){
                   newobj[k]=[];
                   deepCopy(newobj[k],item);
               //3、判断这个值是否是对象
               }else if(item instanceof Object){
                    newobj[k]={};
                    deepCopy(newobj[k],item);
               }else{
                //4、如果是简单数据类型,则直接赋值
                newobj[k] = item;
               }
           }
       }

       deepCopy(o,obj);
       o.msg.age = 20;
       console.log(o);
       console.log("------------");
       console.log(obj);
</script>

在这里插入图片描述

在这里插入图片描述
注意:深拷贝的代码部分一定要先判断属性是不是数组类型,然后再判断是不是对象属性,因为用instanceof这个方法进行判断的话,数组也是对象(因为js里万物皆对象),所以就区分不出数组和对象了,故一定要先判断是不是数组再判断是不是对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值