关于深拷贝与浅拷贝

1. 需要了解javaScript 的变量类型:

  • [1] 基本类型:
    5种基本数据类型Undefined、Null、Boolean、Number 和 String,变量是直接按值存放的,存放在栈内存中的简单数据段,可以直接访问。

  • [2] 引用类型:
    存放在堆内存中的对象,变量保存的是一个指针,这个指针指向另一个位置。当需要访问引用类型的值时,首先从栈中获取该对象的地址指针,然后再从堆内存中获取所需的数据。

  • [3] 注意:
    typeof 是无法判断 function 和 array 的,使用Object.prototype.toString.call(obj) 方法。

2. 不同:

  • [1] 深拷贝:(拷贝对象和源对象)互不影响,开辟一块新的内存地址
    实现:
    1). Array 的 slice 和 concat 方法(实际上是浅拷贝,看起来是深拷贝)
    2). JSON 对象的 parse 和 stringify
    3). Lodash 实现 _.cloneDeep(value)
    4). 借用 jquery 的 $.extend( true, target, object1 [, objectN ] )

  • [2] 浅拷贝:(拷贝对象和源对象)双向改变,指向同一片内存空间
    实现:
    1). 简单的引用复制
    2). Object.assign()
    3). Lodash 实现 _.clone(value)
    4). 借用 jquery 的 $.extend( false, target, object1 [, objectN ] )

注意:遇到比较简单的对象我们应该直接调用clone方法而不是cloneDeep(或者JSON.parse(JSON.stringify(obj)) ),这样既保险也可以减少性能损耗。

3. 应用:
在vue组件中prop传值,遇到下面情况,可以用深度拷贝避免子组件影响到父组件的状态。

对于一个数组或对象类型的 prop 来说,在子组件中改变这个对象或数组本身将会影响到父组件的状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值