简单了解下深拷贝

本文介绍了深拷贝和浅拷贝的概念,指出使用JSON.parse(JSON.stringify())方法进行深拷贝的局限性,特别是在处理包含函数的对象时。并提供了一个复杂的深拷贝实现,确保能正确复制包括函数在内的所有属性,避免影响原对象。这是一个适用于JavaScript开发者的实用技巧。
摘要由CSDN通过智能技术生成

在了解深拷贝之前,我们需要对浅拷贝有一定的理解。

什么是深浅拷贝

浅拷贝:简单来说,浅拷贝就是创建一个新的对象,这个对象有着原始对象属性值的拷贝。如果不进行深拷贝,那么一个对像的值改变了就会影响到另一个对象的值。

深拷贝:了解了浅拷贝的概念,我们就可以将深拷贝理解为在内存中开辟一个新的空间,存放新对象,并且修改新对象的值不会影响原对象。

JSON方法拷贝的缺陷

说到深拷贝,相信很多人首先就会想到 JSON 方法:

let obj = {
    name: "小明",
    age: 20
};

let copyObj = JSON.parse(JSON.stringify(obj));

console.log(obj);
console.log(copyObj);

json方法

但实际上,这个方法进行深拷贝是存在缺陷的。例如,对象中存在函数时既无法被拷贝下来:

    let objHave = {
        name: "小明",
        age: 20,
        doing: function () {
            console.log("爱做的事情");
        }
    };

    let copyHave = JSON.parse(JSON.stringify(objHave));
    console.log(objHave);
    console.log(copyHave);

json方法的缺陷

很复杂但不容易出错的一种方法

这里给大家提供一个挺不错的深拷贝方法,有需要的小伙伴可以把它封装起来:

//  deepClone source 原对象
const deepClone = (source, cache) => {
    if (!cache) {
        cache = new Map();
    }
    if (source instanceof Object) { // 不考虑跨 iframe
        if (cache.get(source)) {
            return cache.get(source)
        }
        let result;
        if (source instanceof Function) {
            if (source.prototype) { // 有 prototype 及时普通函数
                result = function () {
                    return source.apply(this, arguments);
                }
            } else {
                result = (...args) => {
                    return source.call(undefined, ...args);
                }
            }
        } else if (source instanceof Array) {
            result = []
        } else if (source instanceof Date) {
            result = new Date(source - 0)
        } else if (source instanceof RegExp) {
            result = new RegExp(source.source, source.flags)
        } else {
            result = {}
        }
        cache.set(source, result);
        for (let key in source) {
            if (source.hasOwnProperty(key)) {
                result[key] = deepClone(source[key], cache)
            }
        }
        return result
    } else {
        return source
    }
}
let objDoing = deepClone(objHave);
console.log(objHave);
console.log(objDoing);

推荐方法

这里是万物之恋,我们下次再见了!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值