深拷贝实现最完整方案

先说说深拷贝和浅拷贝

  • 浅拷贝

所谓浅拷贝,就是只复制最外一层,里面的都还是相同引用

// 浅拷贝
const a = { name: 'xiaoming', age: 23 }
const b = {}
for (let key in a){
  b[key] = a[key]
}

console.log(b) // { name: 'xiaoming', age: 23 }
console.log(b === a) // false
console.log(b.name === a.name) // true

  • 深拷贝

深拷贝,是将一个对象拷贝到另一个新变量,这个新变量指向的是一块新的堆内存地址

// 深拷贝

function cloneDeep(target) {
    // ...dosomething   实现深拷贝
}

const a = { name: 'xiaoming', age: 23 }
const b = cloneDeep(a)

console.log(b) // { name: 'xiaoming', age: 23}
console.log(b === a) // false
console.log(b.name === a.name) // false

  • 深拷贝实现代码

常用版本

function cloneDeep(target) {
    return JSON.parse(JSON.stringify(target))
}

const a = { name: 'xiaoming', age: 23 }
const b = cloneDeep(a)

console.log(b) // { name: 'xiaoming', age: 23 }
console.log(b === a) // false

虽然大多数时候这么使用是没问题的,但这种方式在工作中还是有很多问题

    1、对象中有字段值为undefined,转换后则会直接字段消失
    2、对象如果有字段值为RegExp对象,转换后则字段值会变成{}
    3、对象如果有字段值为NaN、+-Infinity,转换后则字段值变成null
    4、对象如果有环引用,转换直接报错

    升级一下

function cloneDeep(target) {
    const temp = {}
    for (const key in target) {
        temp[key] = target[key]
    }
    return temp
}

const a = { name: 'xiaoming', age: 23 }
const b = cloneDeep(a)

console.log(b) // { name: 'xiaoming', age: 23 }
console.log(b === a) // false

 看起来不错了,但是遇到层数比较深的还是不可以,在优化一下,递归一下。

function cloneDeep(target) {
    // 基本数据类型直接返回
    if (typeof target
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值