当前位置: 首页 > article >正文

深拷贝的实现

方法一

JSON.parse(JSON.stringify(obj))

这种方式比较方便,但是会有一些局限性

1. 只能是普通对象,对象中不能包含特殊结构,否则都会转成普通对象

// 对象中包含特殊结构
const obj = {
    a: 1,
    b: 2,
    c: new Map(),
};

function deepClone(obj) {
    return JSON.parse(JSON.stringify(obj));
};

console.log(deepClone(obj));

2. 如果包含函数会被丢弃

const obj = {
    a: 1,
    b: 2,
    c: function() {},
};

function deepClone(obj) {
    return JSON.parse(JSON.stringify(obj));
};

console.log(deepClone(obj));

3. 如果包含递归引用,会报错

const obj = {
    a: 1,
    b: 2,
};
obj.c = obj;

function deepClone(obj) {
    return JSON.parse(JSON.stringify(obj));
};

console.log(deepClone(obj));

方法二

通过遍历、递归的方式实现

class Test {
    constructor() {
        this.a = 1;
        this.b = 2;
    }
    c() {
        console.log('c');
    }
}
Test.prototype.d = 3;

const obj = new Test();

function deepClone(value) {
    if (typeof value !== 'object' || value === null) {
        return value;
    }

    // value 是对象
    const result = Array.isArray(value) ? [] : {};
    Object.setPrototypeOf(result, Object.getPrototypeOf(value));
    for (let key in value) {
        if (value.hasOwnProperty(key)) {
            result[key] = deepClone(value[key]);
        }
    }
    return result;
};

console.log(deepClone(obj));


http://www.kler.cn/a/416588.html

相关文章:

  • QuantLib-python使用心得(持续更新)
  • vue中watch监听对象的某个属性
  • redis中的哨兵
  • 从零开始理解JVM:对象的生命周期之对象销毁(垃圾回收)
  • FFmpeg 推流给 FreeSWITCH
  • 音视频流媒体直播/点播系统EasyDSS互联网视频云平台介绍
  • PKO-LSSVM-Adaboost班翠鸟优化最小二乘支持向量机结合AdaBoost分类模型
  • webrtc视频会议学习(三)
  • redis的数据删除策略
  • Java线程池种类及具体应用场景
  • NeurIPS'24 | FlowDCN:基于可变形卷积的任意分辨率图像生成模型
  • 测绘坐标数据封装处理
  • jquery-picture-cut 任意文件上传(CVE-2018-9208)
  • 宇信科技JAVA笔试(2024-11-26日 全部AK)
  • 【算法day3】链表:增删改查及其应用
  • MySQL数据库表的操作
  • MySQL更新JSON字段key:value形式
  • Flink解决延迟数据问题
  • PostgreSQL 中Identity Columns生成一个唯一的标识符
  • Grafana插件安装并接入zabbix数据源
  • 速盾高防cdn支持移动端独立缓存
  • 基于 LlamaFactory 的 LoRA 微调模型支持 vllm 批量推理的实现
  • Go语言技巧:快速统一字符串中的换行符,解决跨平台问题
  • T507 buildroot linux4.9之RTC8563开发调试
  • SQLModel与FastAPI结合:构建用户增删改查接口
  • 海盗王用golang重写的AccountServer功能