面试官 : 深拷贝和浅拷贝的区别 ?

一 :javaScript中存在两大数据类型 :

                基本类型

                引用类型

        基本类型数据保存在栈内存中

        引用类型数据保存在堆内存中 引用数据类型的变量是一个指向堆内存中实际对象的引用,存在栈中

二 : 浅拷贝

浅拷贝 指的是创建新的数据 这个数据有着原始数据属性值的一份精确拷贝

如果属性是基本类型 拷贝的就是基本类型的值 如果属性是引用类型 拷贝的就是内存地址

即浅拷贝就是拷贝一层 ,深拷贝的引用类型则共享内存地址

下面简单实现一个浅拷贝

在JavaScript中 存在浅拷贝的现象有 :

        object.assign

 

        Array.prototype.slice() , Array.prototype.concat()

                        slice()

                        concat() 

    运算符实现的赋值

 

三 : 深拷贝

深拷贝开辟一个新的栈 两个对象属性完全相同 但是对应两个不同的地址 , 修改一个对象的属性 ,不会改变另一个对象的属性

        常见的深拷贝方式:

                JSON.stringifg()

        但是这种方法也有弊端 会忽略 undefined , symbol 和函数

 

 

                递归

 

四 : 区别

通过下边两张图 可以清晰地看到浅拷贝和深拷贝的区别

 

可以看到 浅拷贝和深拷贝都创建出了一个新的对象 但是在复制对象属性的时候 行为就不一样

浅拷贝只复制属性指向某个对象的指针 , 而不是复制对象本身 , 新旧对象还是共享一块内存 ,修改对象属性会影响原对象

但深拷贝会另外创造一个一模一样的对象 新对象跟原对象不共享内存 修改新对象不会改原对象

 

 小提示

前提为拷贝类型为引用类型的情况下 : 

        浅拷贝时拷贝一层 , 属性为对象时 浅拷贝时复制 , 两个对象指向同一个地址 

        深拷贝是递归拷贝深层次 ,属性为对象时 , 深拷贝是新开栈 两个对象指向不同的地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值