对象的浅拷贝和深拷贝

对象的浅拷贝和深拷贝

一、概念

浅拷贝:是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。

深拷贝:不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。

二、区别

浅拷贝:仅仅是指针给了另一个对象,如果拷贝后的对象属性发生变化,原对象属性也会发生变化。

深拷贝:两个对象之间没有任何关系,真正的是对对象的拷贝。

举例来说更加清楚:对象A1中包含对B1的引用,B1中包含对C1的引用。浅拷贝A1得到A2,A2 中依然包含对B1的引用,B1中依然包含对C1的引用。深拷贝则是对浅拷贝的递归,深拷贝A1得到A2,A2中包含对B2(B1的copy)的引用,B2 中包含对C2(C1的copy)的引用。

案例

建立一个对象

var obj = {
            name: '笑笑', age: 24, say() {
                console.log(11111);
            }
        };

浅拷贝:拷贝后的对象属性发生变化,原对象属性也会发生变化

//浅拷贝:拷贝后的对象属性发生变化,原对象属性也会发生变化
        var obj1 = obj;
        console.log(obj1);
        obj1.name = '小甜甜';
        console.log(obj); //name='小甜甜'

深拷贝:两个对象之间没有任何关系,修改obj1中的属性,obj不会改变其原有属性值

方法
1 通过json实现,不能拷贝方法,会造成方法丢失
  var obj1 = JSON.stringify(obj);
        obj1 = JSON.parse(obj1);
        console.log(obj1);
        obj1.name = '花花';
        //obj感受不到变化
        console.log(obj);
2 通过for-in遍历循环,实现
  var obj1 = {};
        for (var attr in obj) {
            obj1[attr] = obj[attr]
        }
        console.log(obj1);
        obj1.say();
        //修改obj1
        obj1.name = 'taxi';
        console.log(obj1); // {name: "taxi", age: 24, say: ƒ}
        console.log(obj); // {name: "笑笑", age: 24, say: ƒ}
3 使用Object.assign() 进行对象合并
 var obj1 = {};
        //将obj合并到obj1上
        Object.assign(obj1, obj);
        console.log(obj1);
        obj1.age = 66;
        console.log(obj);
4 使用…语法(三点语法)
//对象的深拷贝
 var obj = { name: '明明', age: 20 };
// console.log(...obj); //不能直接打印对象,会报错
 var obj1 = { ...obj };
// console.log(obj1);
 obj1.age = 22;
 console.log(obj); //age:20 不改变
5 使用jQuery的$.extend()方法
var res = $.extend(obj, obj1);
        // console.log(res);
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
JavaScript中的对象拷贝分为浅拷贝深拷贝浅拷贝只是复制了对象的引用地址,而不复制对象本身,因此新旧对象还是指向同一个内存地址。而深拷贝则是创建一个全新的对象,包含了原始对象的所有属性和值。 浅拷贝常见的方法有使用Object.assign()方法或使用展开运算符(...)。例如,可以通过Object.assign()方法将原始对象的属性复制到一个空对象中来实现浅拷贝。这样,原始对象浅拷贝对象将指向不同的内存地址,修改其中一个对象不会影响另一个对象的值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [javaScript对象深拷贝浅拷贝](https://blog.csdn.net/qq_50148250/article/details/127481075)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Js对象深拷贝浅拷贝](https://blog.csdn.net/xuexizhe88/article/details/80989813)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值