浅拷贝,深拷贝使用说明

let a = {
  i: 0
}
let b = a
b.i = 2
console.log(a.i)   //2

从上面的例子可以发现当给一个变量赋值一个对象的时候,a,b会共用一个引用地址,但实际开发中我们不需要这样于是有了深浅拷贝

浅拷贝

let a = {
  i: 0
}
let b = Object.assign({}, a)
b.i = 2
console.log(a.i)   //1

一般情况Object.assign可以解决大部分问题,但是当对象有两层的时候又回到了上面的问题引用同一个地址于是又出来了深拷贝

深拷贝

let a = {
  i: 0,
  d: {
    a: 2
  }
}
let b = JSON.parse(JSON.stringify(a))
b.d.a = 1
console.log(a.d.a)   //2

但是这个方法有局限性

  • 会忽略 undefined
  • 会忽略 symbol
  • 不能序列化函数
  • 不能解决循环引用的对象

于是可以百度一下
拷贝的对象含有内置类型并且不包含函数,可以使用 MessageChannel

function structuralClone(obj) {
  return new Promise(resolve => {
    const {port1, port2} = new MessageChannel();
    port2.onmessage = ev => resolve(ev.data);
    port1.postMessage(obj);
  });
}

var obj = {a: 1, b: {
    c: b
}}
// 注意该方法是异步的
// 可以处理 undefined 和循环引用对象
(async () => {
  const clone = await structuralClone(obj)
})()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值