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

js【详解】深拷贝

  什么是深拷贝?

对于引用类型的数据,才有深浅拷贝的说法

  • 浅拷贝 :执行拷贝的变量只复制被拷贝变量内存的引用数据的地址。
被拷贝变量内地址指向的数据发生变化时,执行拷贝的变量也会同步改变
  • 深拷贝
  1. 在堆内存中开辟一个全新的存储空间
  2. 将被拷贝变量中引用地址对应的内容完整复制一份存入新的存储空间
  3. 将新的存储空间的地址存入执行拷贝的变量中。
被拷贝变量内地址指向的数据发生变化时,执行拷贝的变量不会改变

深拷贝方案一 JSON.parse(JSON.stringify(obj))

缺陷:

  • 属性值为函数和undefined的属性会丢失
  • 属性值为正则表达式的会变成{}
  • 属性值为时间对象的会变成时间字符串
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><script>let obj = {string: "字符串",Number: 10,null: null,undefined: undefined,date: new Date(),function: () => {console.log("函数");},RegExp: /^([0]{2}|0[1-9]|[1-9])\d*$/,}console.log("被拷贝的对象");console.log(obj);let objJSONclone = JSON.parse(JSON.stringify(obj));console.log("使用JSON.parse(JSON.stringify(obj))拷贝对象");console.log(objJSONclone);</script></body>
</html>

 深拷贝方案二

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><script>/*** 深拷贝* @param {Object} obj 要拷贝的对象*/let obj = {string: "字符串",Number: 10,null: null,undefined: undefined,date: new Date(),function: () => {console.log("函数");},RegExp: /^([0]{2}|0[1-9]|[1-9])\d*$/,}function deepClone(obj) {if (obj === null) return null;if (typeof obj !== "object") return obj;if (obj.constructor === Date) return new Date(obj);if (obj.constructor === RegExp) return new RegExp(obj);var newObj = new obj.constructor(); //保持继承链for (var key in obj) {//不遍历其原型链上的属性if (obj.hasOwnProperty(key)) {var val = obj[key];// 使用arguments.callee解除与函数名的耦合newObj[key] = typeof val === "object" ? arguments.callee(val) : val; }}return newObj;}let test = deepClone(obj)console.log(test)</script></body>
</html>

 

相关文章:

  • Java学习笔记之Java基础语法02-运算符
  • c语言运算符优先级介绍
  • 20240316-1-向量化搜索
  • EMC Unity存储系统(包含VNXe)常用检查命令
  • 大模型: Function calling的作用
  • 整型溢出问题及解决之道
  • 【开源-土拨鼠充电系统】鸿蒙 HarmonyOS 4.0 App+微信小程序+云平台
  • 【MySQL】InnoDB引擎
  • HTML + CSS 核心知识点- 定位
  • 爬虫逆向sm3和sm4 加密 案例
  • C语言打印当前时间
  • Huggingface 笔记:大模型(Gemma2B,Gemma 7B)部署+基本使用
  • AI论文速读 | UniTS:构建统一的时间序列模型
  • Python中的环境管理与虚拟环境的使用【第148篇—虚拟环境】
  • 【gpt实践】比OpenAI 的 GPT-4 更好模型 Claude 3.0
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【剑指offer】让抽象问题具体化
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Angularjs之国际化
  • exif信息对照
  • fetch 从初识到应用
  • js面向对象
  • PHP 小技巧
  • Protobuf3语言指南
  • Vue实战(四)登录/注册页的实现
  • Webpack 4x 之路 ( 四 )
  • 如何学习JavaEE,项目又该如何做?
  • 深度学习在携程攻略社区的应用
  • 世界上最简单的无等待算法(getAndIncrement)
  • 我从编程教室毕业
  • 学习Vue.js的五个小例子
  • 因为阿里,他们成了“杭漂”
  • 赢得Docker挑战最佳实践
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • MyCAT水平分库
  • 阿里云API、SDK和CLI应用实践方案
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • #1014 : Trie树
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #pragam once 和 #ifndef 预编译头
  • (11)MSP430F5529 定时器B
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (function(){})()的分步解析
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (未解决)macOS matplotlib 中文是方框
  • (五)网络优化与超参数选择--九五小庞
  • (一)Dubbo快速入门、介绍、使用
  • (一)为什么要选择C++
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)Scala的“=”符号简介
  • (转)四层和七层负载均衡的区别