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

手写一个深克隆!!

在JavaScript中实现深克隆有多种方法,这里我将介绍两种常见且实用的方法:使用JSON方法和递归复制。

方法1:使用JSON方法

JSON方法适用于对象不包含循环引用的情况。

function deepCloneWithJSON(obj) {
    return JSON.parse(JSON.stringify(obj));
}
 
// 示例
const original = { a: 1, b: { c: 2 } };
const cloned = deepCloneWithJSON(original);
console.log(cloned); // { a: 1, b: { c: 2 } }
console.log(cloned === original); // false
console.log(cloned.b === original.b); // false

方法2:递归复制

当对象包含循环引用或者需要更细致地控制克隆过程(例如,克隆特定的属性或忽略某些属性)时,递归复制方法更为适用。

function deepClone(obj, hash = new WeakMap()) {
    if (obj === null) return null;
    if (obj instanceof Date) return new Date(obj);
    if (obj instanceof RegExp) return new RegExp(obj);
    if (typeof obj !== 'object') return obj;
    if (hash.has(obj)) return hash.get(obj); // 处理循环引用
 
    const clone = Array.isArray(obj) ? [] : {};
    hash.set(obj, clone); // 存储原始对象和其对应的克隆对象,以便处理循环引用
 
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            clone[key] = deepClone(obj[key], hash);
        }
    }
    return clone;
}
 
// 示例
const original = { a: 1, b: { c: 2 } };
original.b.d = original.b; // 创建循环引用
const cloned = deepClone(original);
console.log(cloned); // { a: 1, b: { c: 2, d: [Circular] } }
console.log(cloned === original); // false
console.log(cloned.b === original.b); // false
console.log(cloned.b.d === cloned.b); // true,正确地处理了循环引用

原文地址:https://blog.csdn.net/renqq001/article/details/145339039
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/523151.html

相关文章:

  • cursor接入deepseek
  • 【自学笔记】Vue基础知识点总览-持续更新
  • 【Android开发】Android Studio汉化
  • 路由过滤方法与常用工具
  • DevOps的个人学习
  • 《optee系统架构从入门到精通》
  • LeetCode:70. 爬楼梯
  • 排序算法- H指数
  • 【C语言分支与循环结构详解】
  • 如何下载SQLServer
  • fprintf(‘parametric_vector:\n‘); disp(parametric_vector);
  • 损失函数 Loss Function
  • 【番外篇】鸿蒙扫雷天纪:运混沌灵智勘破雷劫天局
  • 深入探索 HTML5 拖拽效果 API:打造流畅交互体验
  • 27.收益的定义是什么?
  • 2024年终总结——今年是蜕变的一年
  • 砥砺奋进,展望新程0114
  • Webpack 打包性能优化全解
  • 2025数学建模美赛|D题成品论文
  • 第四节 MATLAB变量
  • BurpSuite--暴力破解
  • Redis 集合(Set)
  • java多线程学习笔记
  • golang中的包管理-上--简介
  • 视频拼接,拼接时长版本
  • JavaScript反爬技术解析与应对