js浅拷贝和深拷贝

1 for in 循环

        const obj = {
            name: '演员',
            age: 18,
            sex: '男'
        }
        for (const key in obj) {

            console.log('键:' + key, '值:' + obj[key]);
        }

输出结果:
在这里插入图片描述

2 递归

函数自己调用自己,就叫递归函数 ,并且还需要有个出口,如果没有就是死归。

        function sum(num) {
            if (num == 1) return 1
            return num + sum(num - 1)

        }

        console.log(sum(5));//15

3 浅拷贝

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

(1)展开运算符实现浅拷贝

        const obj = {
            a: 1,
            b: 2,
            c: {
                ca: 3
            }
        }
        //把对象obj展开  放在一个新对象newobj里面
        const newobj = { ...obj }
        // 此时我们改变newobj中的a属性的值  和c对象下ca属性的值
        newobj.a = 2
        newobj.c.ca = 5
        console.log(obj, newobj);

输出结果中改变newobj.a的值 并没有引起obj中a的值变化
而改newobj.c.ca下的属性 obj.c.ca也发生了变化
说明完成了浅拷贝
在这里插入图片描述

(2) Object.assign(newObj, obj)方法实现浅拷贝

语法: Object.assign(新对象, 拷贝的对象)

        const obj = {
            a: 1,
            b: 2,
            c: {
                ca: 3
            }
        }
        let newobj = {}
        Object.assign(newobj, obj);
        // 此时我们改变newobj中的a属性的值  和c对象下ca属性的值
        newobj.a = 2
        newobj.c.ca = 5
        console.log(obj, newobj);

在这里插入图片描述

4 深拷贝

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

(1)JSON实现深拷贝

JSON.stringify()方法将js对象转换为json字符串。
JSON.parse()方法 将json字符串转换为js对象。

        const obj = {
            a: 1,
            b: 2,
            c: {
                ca: 3
            }
        }
        // 转换为json字符串
        let jsonstr = JSON.stringify(obj)
        console.log(jsonstr);//{"a":1,"b":2,"c":{"ca":3}}
        //转换为js对象
        let newobj = JSON.parse(jsonstr)
        console.log(newobj); 
       // 写在一行就是 let newobj = JSON.parse(JSON.stringify(obj))
        // 此时我们改变newobj中的a属性的值  和c对象下ca属性的值
        newobj.a = 2
        newobj.c.ca = 5
        console.log(obj, newobj);
       

输出结果中改变newobj.a的值和newobj.c.ca下的属性 obj.c.ca的值 都没有引起obj中属性的值变化 说明完成了深拷贝
在这里插入图片描述

(2)递归实现

      let obj = {
        a: 1,
        b: {
          c: 2,
        },
      };
    function deepClone(obj) {
        if(!typeof obj == 'object')  return '传入的不是引用类型'
        let newClone = Array.isArray(obj)? [] : { }
        for (const key in obj) {
            newClone[key] = typeof obj[key] == 'object'? deepClone(obj[key]) : obj[key]
        }
        return newClone
    }

    const dep = deepClone(obj)

    dep.a = 2
    dep.b.c = 3


    console.log(dep,obj);

在这里插入图片描述

(3)第三方库实现

此处不多讲了 直接看官网
lo大师库链接: lo大师库链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值