js 深拷贝和浅拷贝学习记录



 

        const llf = {

            uname: 'llf',

            age: 24,

        }

        const ifeng = llf

        ifeng.age = 25

        console.log(llf);

         这里我们改了ifeng的age,打印llf发现llf的age也变成了25,直接赋值的方法只要是对象,都会互相影响,因为直接拷贝对象栈里面的地址,

        递归是自己调用自己,函数内部自己调用自己,但是会栈溢出,因为一直调用自己 ,需要加判断条件,符合判断条件时阻止调用自己ctrl       

 let i=1;

function ikun() {

            console.log(`这是第${i}次唱跳rap篮球`);

            if (i >= 6) {

                return

            }

            i++

            ikun()

        }

        ikun()

         利用递归函数实现用setTimeout实现setinterval的功能,toLocaleString是new Date()内置对象的一个方法,获取当前的时间。       

<div> </div>

function getTime() {

            document.querySelector('div').innerHTML = new Date().toLocaleString()

            setTimeout(getTime, 1000)



        }

        getTime()

        浅拷贝进一步判断变成深拷贝,cxk是旧对象,wyf是空的新对象。

        因为浅拷贝拷贝的是简单数据类型是直接拷贝值,如果属性值是引用数据类型则拷贝的是地址,简单数据类型后期如果更改wyf的属性值是不会影响旧对象cxk的,

        如果是像下面案例一样,cxk对象里面再嵌套一个复杂数据类型hoppy的话,后期更改wyf的hoppy就会影响旧对象cxk的hoppy,因为wyf喜欢未成年。

    浅拷贝如果是一层对象的,不互相影响,如果多层对象拷贝还是会互相影响       

 const cxk = {

            uname: 'cxk',

            age: 18,

            hoppy: ['唱', '跳', 'rap', '篮球']

        }

        const wyf = {}

        // 利用for in 遍历cxk这个对象, 让cxk的值赋值给wyf的值, cxk[k]指的是值, 里面的k是指属性和方法的名字, 这样让cxk的所有对象都加入到wyf这个空对象了       

function ikun(wyf, cxk) {



            for (let k in cxk) {

                wyf[k] = cxk[k]

            }

        }

        ikun(wyf, cxk)

        wyf.hoppy[0] = '未成年'

        console.log(cxk);

        // 我们这里把wyf的hoppy改成了未成年,但是输出一下cxk,发现cxk也变成了未成年,ikun们不同意,

        // 所以我们现在再加一个判断条件变成深拷贝,避免这个情况       

function ikun(wyf, cxk) {



            for (let k in cxk) {

                // 判断cxk[k]是否属于数组,instanceof判断是否为数组

                if (cxk[k] instanceof Array) {

                    // 其实就是把cxk的hoppy进行遍历 
                  //再赋值给wyf[] 本来还需要进行一次forin进行遍历
                   // 但是外层这个ikun就是遍历,所以我们再次调用一下ikun

                    // 先声明一个空数组,把旧数组装进空数组

                    wyf[k] = []

                    // ikun(wyf[k], ['唱', '跳', 'rap', '篮球'])

                    ikun(wyf[k], cxk[k])

                } else {

                    wyf[k] = cxk[k]

                }



            }

        }

        ikun(wyf, cxk)

        wyf.hoppy[0] = '未成年'

        console.log(cxk);

        这个时候我们再次更改wyf的hoppy,发现已经影响不了cxk了,ikun是无敌的 冲冲冲

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值