欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

深拷贝浅拷贝

程序员文章站 2022-05-29 10:49:24
...

理解的深拷贝浅拷贝,不得不说,每次面试基本都会问到这个问题,可是貌似我每次答的都不在那个点上,所以我又研究了一番!!若有不对,望指出!!
首先,需要明确一点,深拷贝和浅拷贝都是对于引用数据类型来说的
对于基本数据类型,直接就放在栈内存中存储即可,而对于引用数据类型来说,其实只是把这个引用数据类型的名字存在栈内存中,而真正里面的数据存储在堆内存中。
对于基本数据来说,当我们给他赋值的时候,就会给他开辟一个栈内存。
深拷贝浅拷贝
也就是说对于基本数据类型我们就是按值访问,对与引用数据类型来说是按地址来访问。深拷贝和浅拷贝说白了,其实都是为了当改变原先数据的值,可以保证拷贝之后的数据不会受到影响。
下面我们来看浅拷贝
方法一:Object.assign

		let obj = {
            name: 'shizi',
            age: 22
        }
        let b = Object.assign({}, obj)
        obj.age = 33
        console.log(b);

深拷贝浅拷贝
可以看到当我们改变obj的值的时候,通过浅拷贝方式得到的b的值并没有受到影响。
方法二:es6中新增的展开运算符

		let obj = {
            name: 'shizi',
            age: 22
        }
        // let b = Object.assign({}, obj)
        let b = {
            ...obj
        }
        obj.age = 33
        console.log(b);

深拷贝浅拷贝
下面我们来看这种情况

		let obj = {
            name: 'shizi',
            age: 22,
            a: {
                name: 'lss',
                age: 33
            }
        }
        let b = Object.assign({}, obj)
        // let b = {
        //     ...obj
        // }
        obj.a.age = 22
        console.log(b);

深拷贝浅拷贝
很明显,这个值改变它做到了 ,它成功的把咱们浅拷贝过来的值也给改变了,哈哈哈!!脑壳痛。。。
那言归正传,针对这种情况,浅拷贝已经没有作用了,那么深拷贝该上场了,从字面意义一看,就能看出来深拷贝比浅拷贝更加厉害了。
JSON.parse(JSON.stringify(object))

	   let obj = {
            name: 'shizi',
            age: 22,
            a: {
                name: 'lss',
                age: 33
            }
        }
        let b = JSON.parse(JSON.stringify(obj))
        // let b = Object.assign({}, obj)
        // let b = {
        //     ...obj
        // }
        obj.a.age = 22
        console.log(b);

深拷贝浅拷贝

小结

总的来说,也就是浅拷贝只可以保护第一层可以不被原本值的改变所影响,第二层就保护不到了,而深拷贝则也可以保护第二层里面的值也不被原本值的改变所影响,为此我又想那第三层第四层呢,通过我滴测试,都不会被影响到。

相关标签: 深拷贝浅拷贝