ES6学习笔记(八)深拷贝 浅拷贝

特殊的assign()

如果assign()的拷贝类型是简单类型,拷贝形式为深拷贝

let obj_1 = {
    name: 'Faker',
    age: 24
}
let obj_2 = {

}
Object.assign(obj_2, obj_1)
console.log(obj_2) // {name: "Faker", age: 24}

如果assign()的拷贝形式为对象或其它引用类型,拷贝类型为浅拷贝

let obj_1 = {
    name: 'Faker',
    age: 24,
    food: {
        vegetable: 'broccoli',
        mainFood: 'poke',
    }
}
let obj_2 = {
    name: 'Bang',
    age: 23,
    food: {
        vegetable: '1',
        mainFood: '1',
        coffee: 'Americano' // 多了一个coffee属性
    }
}
Object.assign(obj_2, obj_1)
console.log(obj_2) // coffee属性丢失
// {name: "Faker", age: 24, food: {vegetable: "broccoli", mainFood: "poke"}}

使用JSON实现类的深拷贝

let obj_1 = {
    name: 'Faker',
    age: 24,
    food: {
        vegetable: 'broccoli',
        mainFood: 'poke',
    }
}
let str = JSON.stringify(obj_1)
let obj_2 = JSON.parse(str)
console.log(obj_2)
// {name: "Faker", age: 24, food: {vegetable: "broccoli", mainFood: "poke"}}

手写深拷贝

let checkType = data => {
    return Object.prototype.toString.call(data).slice(8, -1)
}

let deepClone = target => {
    let targetType = checkType(target)
    let result
    if (targetType === 'Object') {
        result = {}
    }
    else if (targetType === 'Array') {
        result = []
    }
    else {
        return target
    }
    for (let i in target) {
        let value = target[i]
        if (checkType(value) === 'Object' || checkType(value) === 'Array') {
            result[i] = deepClone(value)
        } else {
            result[i] = value
        }
    }
    return result
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值