前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >js深拷贝常用的方法

js深拷贝常用的方法

作者头像
不爱吃糖的程序媛
发布2024-03-28 09:17:00
1000
发布2024-03-28 09:17:00
举报

在JavaScript中,实现深拷贝(deep copy)有多种方法。以下是一些常用的方法:

1. 使用JSON方法(局限性大):

代码语言:javascript
复制
function deepClone(obj) {
    return JSON.parse(JSON.stringify(obj));
}

这个方法简单易用,但对于循环引用、特殊对象(如Date、RegExp、Set、Map等)以及函数等类型无法正确处理。

2.使用递归函数:

代码语言:javascript
复制
function deepClone(obj, hash = new WeakMap()) {
    if (obj === null) return null;
    if (typeof obj !== 'object') return obj;
    if (hash.has(obj)) return hash.get(obj);

    let cloneObj = new obj.constructor();
    hash.set(obj, cloneObj);

    for (const key in obj) {
        if (obj.hasOwnProperty(key)) {
            cloneObj[key] = deepClone(obj[key], hash);
        }
    }
    return cloneObj;
}

这个方法可以处理大多数情况,包括循环引用,但可能不支持某些特殊对象和函数。

3.使用库: lodash库的_.cloneDeep方法:

代码语言:javascript
复制
import _ from 'lodash';
const newObj = _.cloneDeep(oldObj);

ramda库的cloneDeep方法:

代码语言:javascript
复制
import R from 'ramda';
const newObj = R.cloneDeep(oldObj);

这些库提供了许多实用的函数,但会增加项目的依赖。

4.使用Proxy(ES2018+):

代码语言:javascript
复制
function deepClone(obj, hash = new WeakMap()) {
    if (obj === null) return null;
    if (typeof obj !== 'object') return obj;
    if (hash.has(obj)) return hash.get(obj);

    let handler = {
        get(target, prop, receiver) {
            if (prop in target) {
                return Reflect.get(target, prop, receiver);
            } else if (typeof prop === 'symbol' && prop in Object.getOwnPropertySymbols(target)) {
                return Reflect.get(target, prop, receiver);
            }
            let cloneObj = new target.constructor();
            hash.set(target, cloneObj);
            return deepClone(target[prop], hash);
        }
    };

    let cloneObj = new Proxy(obj, handler);
    return cloneObj;
}

这种方法是最强大的,可以处理大多数特殊情况,包括函数和循环引用,但也最复杂。 每种方法都有其优点和局限性,应根据具体需求选择合适的方法。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档