JavaScript — 深拷贝的几种方式、手写深拷贝

废话不多说,直接上干货,走起!

1、JSON.parse 搭配 JSON.stringify

通过 JSON.stringify 将对象转换成字符串,然后再通过 JSON.parse 将字符串再解析为对象,这样就能完成一个对象的深拷贝。

let list = [
    { name: 'lisi', age: 18 },
    { name: 'wangwu', age: 19 },
]
let newList = JSON.parse(JSON.stringify(list))

注意:只能完成大约80%的深拷贝,因为对于 function 方法,转为字符串再解析回来会变成 "function" ,这就导致带有方法的对象不能进行深拷贝

2、递归调用

第一种:
// 封装深拷贝函数 source为传入的对象
function deepClone(source){
    // 准备一个容器
    // 数组的构造函数为Array(基类)、对象的构造函数为Object
    const targetObj = source.constructor === Array ? [] : {}
    // for in遍历对象
    for(let key in source) {
        // hasOwnProperty()方法用于检测一个对象是否含有特定的【自身属性】,返回一个布尔值
        // 为了过滤掉继承原型链的属性 只拿到自身的属性
        if (source.hasOwnProperty(key)) {
            // 引用数据类型
            if (source[key] && typeof source[key] === 'object') {
                // 递归
                targetObj[key] = deepClone(source[key])
            } else {
                // 基本数据类型
                targetObj[key] = source[key]
            }
        }
    }
    return targetObj
}

hasOwnProperty()方法用于检测一个对象是否含有特定的自身属性,返回一个布尔值

第二种:
// 封装函数 深拷贝
function deepCopy(newObj, oldObj) {
    for (var k in oldObj) {
        // 判断我们的属性值属于哪种数据类型
        // 1 获取属性值
        var item = oldObj[k];
        // 2 判断这个值是否是数组 先写数组后写对象,是因为数组也是对象
        if (item instanceof Array) {
            newObj[k] = [];
            // 相当于o.color=[]
            deepCopy(newObj[k], item);
        }
        // 3 判断这个值是否是对象
        else if (item instanceof Object) {
            newObj[k] = {};
            deepCopy(newObj[k], item);
        }
        // 4 属于简单数据类型
        else {
            newObj[k] = item;
        }
    }
}

3、loadsh 库的 cloneDeep(value)

如何使用这个 API 呢?我们需要先下载 lodash 包

npm i loadsh

然后需要在使用的文件中引入这个包

import _ from 'lodash'

之后便可以对这个API进行调用

const newObj = _.cloneDeep(cloneObj)

这样就完成了loadsh库实现深拷贝


补充:Object.assign(target, ...sources) 和 解构赋值浅拷贝


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GG 爆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值