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

13.JS实现深拷贝的方式

实现方式1(JSON.stringfy)

  • JSON.parse(JSON.stringify(obj))是目前比较常用的深拷贝方法之一,它的原理就是利用JSON.stringify 将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象。
  • 这个方法可以简单粗暴的实现深拷贝,但是还存在问题,拷贝的对象中如果有函数,undefined,symbol,当使用过JSON.stringify()进行处理之后,都会消失

let obj1 = {  a: 0,b: {c: 0}};
let obj2 = JSON.parse(JSON.stringify(obj1));
obj1.a = 1;
obj1.b.c = 1;
console.log(obj1); // {a: 1, b: {c: 1}}
console.log(obj2); // {a: 0, b: {c: 0}}

实现方式2(函数库lodash的_.cloneDeep方法)

该函数库也有提供_.cloneDeep用来做 Deep Copy

var _ = require('lodash');
var obj1 = {a: 1,b: { f: { g: 1 } },c: [1, 2, 3]
};
var obj2 = _.cloneDeep(obj1);
console.log(obj1.b.f === obj2.b.f);// false

实现方式3(手写)

实现步骤

        1.如果复制的对象非对象或为空,直接返回

        2.数组和对象分类初始化

        3.对键进行递归拷贝

function deepClone(object){if(!object || typeof object !== 'object') return ;const newObject = Array.isArray(object) ? []:{}for(let key in object){//若是对象本身具有的属性if(object.hasOwnProperty(key)){newObject[key] = typeof object[key] === 'object' ? deepClone(object[key]) : object[key]}}return newObject;
}

相关文章:

  • 【Linux】SystemV IPC
  • WPF控件-ItemsControl
  • Elasticsearch 安装和配置脚本文档
  • 【C语言】案例:输出n位水仙花数
  • Python学习路线 - Python高阶技巧 - PySpark案例实战
  • Java Jackson库使用教程
  • 1.0 Zookeeper 分布式配置服务教程
  • 性能实测:分布式存储 ZBS 与集中式存储 HDS 在 Oracle 数据库场景表现如何
  • 【数据分享】1929-2023年全球站点的逐月平均风速(Shp\Excel\免费获取)
  • powershell 接收一个端口udp数据复制转发到多个目的
  • 【Linux】线程池线程安全的单例模式和STL读者写者问题
  • l + r >> 1; 的含义
  • Python入门:常用模块—os模块及sys模块
  • 探索未来:集成存储器计算(IMC)与深度神经网络(DNN)的机遇与挑战
  • 服务器与电脑的区别?
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • codis proxy处理流程
  • github指令
  • Java多线程(4):使用线程池执行定时任务
  • js 实现textarea输入字数提示
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Laravel5.4 Queues队列学习
  • mac修复ab及siege安装
  • MySQL主从复制读写分离及奇怪的问题
  • 关于for循环的简单归纳
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 解析带emoji和链接的聊天系统消息
  • 手写一个CommonJS打包工具(一)
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 小程序开发之路(一)
  • 学习笔记:对象,原型和继承(1)
  • 译有关态射的一切
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • #define用法
  • #大学#套接字
  • #预处理和函数的对比以及条件编译
  • (c语言)strcpy函数用法
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • .mysql secret在哪_MySQL如何使用索引
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .net 验证控件和javaScript的冲突问题
  • .NET简谈设计模式之(单件模式)
  • @DataRedisTest测试redis从未如此丝滑
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [17]JAVAEE-HTTP协议
  • [AIGC] Spring Interceptor 拦截器详解
  • [BUG] Authentication Error
  • [C++]打开新世界的大门之C++入门
  • [cogs2652]秘术「天文密葬法」
  • [flask] flask的基本介绍、flask快速搭建项目并运行
  • [i.MX]飞思卡尔IMX6处理器的GPIO-IOMUX_PAD说明