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

js 对象深拷贝、浅拷贝有哪些方法/设拷贝循环引用报错

浅拷贝

1. 扩展运算符 ...const obj = { a: 1, b: { c: 2 } };
const shallowCopy = { ...obj };obj.b.c = 3;
console.log(shallowCopy.b.c); // 3(被修改)
2.Object.assign()
const obj = { a: 1, b: { c: 2 } };
const shallowCopy = Object.assign({}, obj);obj.b.c = 3;
console.log(shallowCopy.b.c); // 3(被修改)
3. 数组的浅拷贝方法
const arr = [1, 2, { a: 3 }];
const shallowCopy1 = arr.slice();
const shallowCopy2 = [...arr];
const shallowCopy3 = Array.from(arr);arr[2].a = 4;
console.log(shallowCopy1[2].a); // 4(全部被修改)

深拷贝(Deep Copy)

    1. JSON.parse(JSON.stringify())(最简单但有局限)
const obj = { a: 1, b: { c: 2 },d: new Date(),e: function() {},f: undefined,g: /regex/,h: Symbol('sym')
};const deepCopy = JSON.parse(JSON.stringify(obj));console.log(deepCopy);
// 输出: { a: 1, b: { c: 2 }, d: "2023-05-15T12:00:00.000Z", g: {} }
// 丢失了: e(函数)、f(undefined)、h(Symbol)
// 注意: 日期变成了字符串,正则表达式变成了空对象
  • 不能处理函数、undefined、Symbol
  • 会丢失对象的构造函数信息
  • 遇到循环引用会报错
  • . 递归实现深拷贝
function deepClone(source, hash = new WeakMap()) {if (source === null || typeof source !== 'object') {return source;}// 处理循环引用if (hash.has(source)) {return hash.get(source);}const target = Array.isArray(source) ? [] : {};hash.set(source, target);for (let key in source) {if (source.hasOwnProperty(key)) {target[key] = deepClone(source[key], hash);}}return target;
}const obj = { a: 1, b: { c: 2 } };
const deepCopy = deepClone(obj);obj.b.c = 3;
console.log(deepCopy.b.c); // 2(未被修改)
  • 使用第三方库
 lodash 的 _.cloneDeep()import _ from 'lodash';const obj = { a: 1, b: { c: 2 } };
const deepCopy = _.cloneDeep(obj);
  • HTML5 的 structuredClone()(较新API)
const obj = { a: 1, b: { c: 2 },d: new Date(),e: [1, 2, 3]
};try {const deepCopy = structuredClone(obj);console.log(deepCopy);
} catch (err) {console.error('不支持 structuredClone 或对象包含不可克隆属性');
}
  • 支持的数据类型:
  • 原始值

  • Boolean、Number、String 对象

  • Date、RegExp、Blob、File、ImageData

  • Array、Object、Map、Set

  • ArrayBuffer、DataView

  • 不支持:

  • Function、DOM节点

  • 对象的原型链

  • 某些特定属性(如Error的stack)

http://www.xdnf.cn/news/121789.html

相关文章:

  • 从机械应答到智能对话:大模型为呼叫注入智慧新动能
  • AD16如何执行DRC检测
  • 事务详细介绍
  • SVN钩子脚本获取日志中文乱码解决办法
  • Pikachu靶场
  • GIT 使用小记
  • Electron Forge【实战】百度智能云千帆大模型 —— AI聊天
  • nuxt3持久化存储全局变量
  • 【深度学习核心技术解析】从理论到实践的全链路指南
  • 【Python解释器】Pycharm中找不到Python打包工具-解决办法
  • 优化Nginx的下载功能
  • EFISH-SBC-RK3588无人机地面基准站项目
  • Spring 中@Autowired,@Resource,@Inject 注解实现原理
  • 中间系统-SPF计算
  • 如何规避矩阵运营中的限流风险及解决方案
  • 如何测试短信接口
  • Java String对象创建过程
  • 如何借助ETL数据集成工具实现数据一致性?
  • 腾讯云服务器安全——服务防火墙端口放行
  • 【棒球运动】户外运动安全技巧·棒球1号位
  • 多头注意力
  • Redis-缓存应用 本地缓存与分布式缓存的深度解析
  • React 的 useEffect 清理函数详解
  • MCP servers源码详细解析
  • 把dll模块注入到游戏进程的方法_挂起进程注入
  • AOSP CachedAppOptimizer 冻结方案
  • 项目——高并发内存池
  • (八)深入了解AVFoundation-采集:拍照功能的实现
  • Java学习手册:TCP 协议基础
  • Python函数与模块笔记