-
什么是深拷贝和浅拷贝?
JavaScript中变量大体上可分为基本类型(string、Boolean、undefined、number、null)和引用类型(Array、Object、function)两类。
在写代码的时候我们可能需要在保留原数据的基础上得到经过某些处理或修改之后的值,通常我们的做法是拷贝一个新的数据,经过处理后,得到一个处理后的值且不影响原数据。但是如果被拷贝的数据是引用类型,可能会出现改变拷贝数据后,原数据也会被改变的情况,原因为使用的拷贝方法为浅拷贝,只是拷贝了指向真正存储引用类型数据的地址,修改拷贝数据的时候,实际修改的还是原数据,所以如果想要不影响原数据的效果应该使用深拷贝。
-
深拷贝和浅拷贝的区别?
深拷贝和浅拷贝的最大的区别就是,深拷贝除了拷贝指向存储引用类型数据的地址之外,还会申请一个新的内存地址,将对应数据存入这个新的内存地址,并修改指向引用类型数据的地址为新的内存地址。
当我们需要使用某个对象的值,在修改时不想修改原对象;es6数组新增的map、filter等方法;暂存从服务器请求到的数据,页面设计到保存和取消请求到的数据等使用的都是深拷贝。
-
深拷贝实现方式
-
递归
function deepClone(obj){ let newobj = null; //typeof判断是不是应用类型,入参是否为null if(typeof(obj) == 'Object' && obj !== null){ //instanceof判断是否为数组,正确初始化初始值 newobj = obj instanceof Array ? [] : {}; for(let i in obj){ //递归调用 newobj[i] = deepClone(obj[i]); } }else{ newobj = obj; } return newobj; } -
JSON对象
function deepClone(obj){ if(obj == null){ return null; } let temp = JSON.stringfy(obj); let cloneobj = JSON.parse(temp); return cloneobj; }缺点:无法实现对象中方法的深拷贝
-
extend
function deepClone(obj){ if(obj == null){ return null; } if(obj instanceof Array){ return $.extend(true,[],obj); }else{ return $.extend(true,{},obj); } }tips:当extend第一个参数为false时,则为浅拷贝
-
assign
function deepClone(obj){ if(obj == null){ return null; } return Object.assign(obj); }缺点:该方法仅拷贝一级属性,如存在二级属性,该方法则无法正确实现深拷贝
-
lodash
lodash.cloneDeep();
-
-
浅拷贝实现方式
-
直接赋值
-
遍历拷贝
function shallowCopy(obj){ if(obj == null){ return null; } let cloneobj = obj instanceof Array ? [] : {}; for(let i in obj){ if(obj.hasOwnProperty(i) || obj[i]){ cloneobj[i] = obj[i] } } return cloneobj; } -
extend
function shallowCopy(obj){ if(obj == null){ return null; } if(obj instanceof Array){ return $.extend(false,[],obj); }else{ return $.extend(false,{},obj); } } -
assign
使用方法同上面深拷贝中用法,如果对象包含二级属性即为浅拷贝方法
-
相关推荐
利用Sigrity的SPEED2000进行时域电源噪声分析
SPEED2000进行时域电源噪声分析
一文大白话讲清楚javascript数据的赋值、浅拷贝和深拷贝以及js内置的浅拷贝和深拷贝方法
一文大白话讲清楚javascript数据的赋值、浅拷贝和深拷贝以及js内置的浅拷贝和深拷贝方法
云模型在综合评价过程中的应用
目录 1 云模型标尺(标准云模型)的构建方法 1.1 通过正态云的“3En 规则”来表示评价论域 1.2 通过论域的边界值隶属度相等来表示评价论域 1.3 通过黄金分割法来表示评价论域 2 确定评价结果的过程 2.1 基本云发生器 2.2 X条件云发生器 2.3 两种方法的区别 综合评价问题一般分为以下六个步骤 1、明确评价目的; 2、确定被评价对象; 3、建立评价指标体系(包括收集评价指标的原始值、评价指标的若干预处理等); 4、确立与各项评价指标相对应的权重系数; 5、选..
js 对象深拷贝_javascript深拷贝与浅拷贝
这是一道几乎所有面试都会面试的问题,为什么会有这个问题的因为这个问题涉及js基础知识比较多,所以经常拿来问,我们看下会涉及哪些知识:一 js基本类型的分类以及包含哪些?基础类型:undefined 、 null、number、string、boolean、symbol引用类型:object对象类型(Object 、Array 、Function 、Data)对于这两种类型有几个关键知识点:1 基础...
LABVIEW学习之MODBUS-TCP通讯
LABVIEW学习之MODBUS-TCP通讯 1,MODBUS-TCP通讯介绍: MODBUS通讯是工业上面经常用到的一种通讯协议。该协议的原理及介绍不在此累述,下面直接介绍LABVIEW对此协议的应用。 2,MODBUS通讯所需的函数: 安装了DSC模块之后可以在数据通信内找到相关函数 3 ,主VI 主要思路就是使用状态机来进行连接 读取 写入 断开。使用枚举类型来选择状态: 1,连接 2,写入多个M继电器: 3,写入单个M继电器 4,写入双字节D...
Upwork数据战争:用爬虫与AI预测垄断订单
当普通自由职业者还在“等客户发需求”时,顶尖玩家已用数据预测客户明天需要什么; 当竞争对手熬夜抢单时,你的爬虫早已自动提交提案—— 这不是科幻,而是2025年的现实! 本文将手把手教你用合法工具搭建“数据战情室”,让每个决策都有万亿级数据支撑!
Javascript》》JS》》 深拷贝、浅拷贝
【代码】Javascript》》JS》》 深拷贝、浅拷贝。
遇到问题--OpenClaw--API rate limit reached. Please try again later429 您的账户已达到速率限制,请您控制请求频率
OpenClaw调用glm-4.7-flash模型时触发智谱AI平台429速率限制错误。分析发现当前重试策略采用固定间隔(7-11秒)导致连续失败,且未记录关键响应头信息。解决方案分三步:1)开启响应头日志获取配额详情;2)将重试策略改为带抖动的指数退避(初始1秒,最大60秒);3)在网关层实现令牌桶限流主动控制请求频率。需特别注意令牌配额(TPM)可能比请求次数(RPM)更早触达限制。
js 深拷贝_小猿圈JavaScript深拷贝和浅拷贝
你会不会在开发项目的过程中遇到这样的问题,经常会拿到一个数据后需要拷贝一份副本出来,而且很多前端框架都是拷贝的,针对以上的问题小猿圈讲师分享给大家JavaScript深拷贝和浅拷贝,希望对于学习中的你,有一定的帮助。涉及到了JS中对数据的深浅拷贝问题,所谓深浅拷贝,浅拷贝的意思就是,你只是复制了对象数据的引用,并没有把内存里的值另外复制一份,那么深拷贝就是把值完整地复制一份新的值。操作拷贝之后的数...
中台战略-第五章、中台建设方法论
文章目录第五章、中台建设方法论5.1 中台架构整体策略5.2 业务顶层设计5.3 业务中台设计方法论5.3.1 能力支撑是基础5.3.2 中心自治是承载形式5.3.3 3层模型是骨架5.3.4 5步法是指导思想1. 业务抽象2. 高阶设计3. 组件建模4. 开发交付5. 持续运营5.4 数据中台设计方法论5.4.1 总体规划5.4.2 数据集成5.4.3 模型建设5.4.4 通用研发5.4.5 资产管理5.4.6 数据服务5.5 应用向中台迁移的3中途径和方法5.5.1 方法1:新应用替换旧应用5.5.2
嵌入式系统开发笔记101:STM32CubeIDE安装过程中的2个错误及其解决方法
STM32CubeIDE在安装过程中,遇到了2个错误,本文阐述其解决方法。产生上述错误的原因,都在于中文。STM32CubeIDE不能很好的支持中文,所以在使用STM32CubeIDE进行项目设计的过程中,不要使用中文,包括项目所在的路径。
javascript的深拷贝与浅拷贝
js常见面试题之深拷贝与浅拷贝,包含手撕代码等
RK35X8调试YT8531单网口千兆以太网PHY芯片,修复ping不通或者IP地址丢失的问题
RK35X8上调试YT8531以太网PHY
js 浅拷贝直接赋值_深入剖析javaScript中的深拷贝和浅拷贝
在面试时经常会碰到面试官问:什么是深拷贝和浅拷贝,请举例说明?如何区分深拷贝与浅拷贝,简单来说,假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,如果B没变,那就是深拷贝;我们先看两个简单的案例://案例1 var a1 = 1, a2= a1;console.log(a1) //1console.log(a2) //1a2 = 2; //修改 a2consol...
老版QQ原生表情gif动态
这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。
精雕软件(JDpaint) 5.5 绿色版
精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版
js 浅拷贝直接赋值_小猿圈JavaScript深拷贝和浅拷贝
你会不会在开发项目的过程中遇到这样的问题,经常会拿到一个数据后需要拷贝一份副本出来,而且很多前端框架都是拷贝的,针对以上的问题小猿圈讲师分享给大家JavaScript深拷贝和浅拷贝,希望对于学习中的你,有一定的帮助。涉及到了JS中对数据的深浅拷贝问题,所谓深浅拷贝,浅拷贝的意思就是,你只是复制了对象数据的引用,并没有把内存里的值另外复制一份,那么深拷贝就是把值完整地复制一份新的值。操作拷贝之后的数...
数学建模模型总结
这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!
JS 浅拷贝和深拷贝
JS 浅拷贝和深拷贝
VB摄像头监控
该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制
javascript—— JS 深拷贝与浅拷贝方法总结
<script> var arr1 = [1,2,3,{a:4}]; var arr2 = []; //浅拷贝 function shallowCopy(a1, a2){ a2 = a1; } //普通元素为深拷贝,对象为浅拷贝 function copy(a1, a2){ //a2 = a1.slice();//第一种 //a2 = a1.concat()...
【JavaScript】浅拷贝和深拷贝
JavaScript中的对象拷贝是我们在日常开发中经常遇到的一个问题。深浅拷贝是两种常见的拷贝方式,它们分别适用于不同的场景。本文将深入探讨JavaScript中浅拷贝和深拷贝的概念、区别以及实现方式。
js深拷贝和浅拷贝对数组的影响_浅拷贝与深拷贝-javaScript
浅拷贝与深拷贝为了更好的理解js的深浅拷贝,我们先来理解一些js基本的概念数据类型javascript中的数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)和复杂的数据类型(也称作引用数据类型-Object)。当一个变量存放基本数据类型时与复杂的数据类型时分别存在以下的特点:基本数据类型的特点:变量直接将基本数据类型的值存储在栈(...
js 浅拷贝直接赋值_浅拷贝与深拷贝-javaScript
浅拷贝与深拷贝为了更好的理解js的深浅拷贝,我们先来理解一些js基本的概念数据类型javascript中的数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)和复杂的数据类型(也称作引用数据类型-Object)。当一个变量存放基本数据类型时与复杂的数据类型时分别存在以下的特点:基本数据类型的特点:变量直接将基本数据类型的值存储在栈(...
js深拷贝和浅拷贝对数组的影响_一文读懂javascript深拷贝与浅拷贝
前言在 javascript 中有不同的方法来复制对象,如果你还不熟悉这门语言的话,复制对象时就会很容易掉进陷阱里,那么我们怎样才能正确地复制一个对象呢?读完本文,希望你能明白:什么是深/浅拷贝,他们跟赋值有何区别?深/浅拷贝的实现方式有几种?浅拷贝与深拷贝浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷...
JavaScript中的深拷贝和浅拷贝
浅拷贝是指创建一个新对象或数组,并将原对象或数组的第一层属性或元素复制到新对象或数组中。对于基本类型(如numberstringboolean等),浅拷贝会直接复制其值;但对于引用类型(如objectarray等),浅拷贝只会复制引用,而不会递归地复制嵌套的对象或数组。因此,如果修改了新对象或数组中的引用类型属性,原对象或数组也会受到影响。深拷贝是指创建一个全新的对象或数组,并递归地复制原对象或数组中的所有属性和元素,包括嵌套的对象和数组。
js深拷贝和浅拷贝对数组的影响_Javascript浅拷贝和深拷贝分析
一、什么是浅拷贝、什么是深拷贝我们都知道js的数据类型分为基本类型和引用类型,一般讨论到浅拷贝和深拷贝的都是针对引用类型的,像Object和Array这样的复杂类型,1、浅拷贝:以Object为例 var a = { name: 'Wendy' }; var b = a; b.name = 'Lily'; console.log(b.name); // Lily console.log(a.nam...
JS的深拷贝和浅拷贝
介绍JS的浅拷贝和深拷贝
js 深拷贝_我不知道的JS之深拷贝和浅拷贝
我不知道的JS之深拷贝和浅拷贝深拷贝和浅拷贝是什么?通过上一篇文章,我们已经知道JavaScript在执行时,V8引擎会把程序用到的变量存储在内存的两个不同的逻辑分块中:栈和堆中。至于为什么要这么存,简单来说栈是程序运行时的上下文,可以通过栈来非常快速的切换执行上下文。这就要求栈的每个元素占用的存储空间必须是「固定的(32字节)大小」(为了方便下文中把这个固定大小的空间叫作一个存储单元),但是我们...
3620



被折叠的 条评论
为什么被折叠?



