js深拷贝和浅拷贝

一、数组的深浅拷贝

在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致了问题的发生。

var arr = ["One","Two","Three"];var arrto = arr;
arrto[1] = "test";
document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,test,Three
document.writeln("数组的新值:" + arrto + "<br />");//Export:数组的新值:One,test,Three

像上面的这种直接赋值的方式就是浅拷贝,很多时候,这样并不是我们想要得到的结果,其实我们想要的是arr的值不变,不是吗? 
方法一:js的slice函数 

复制代码
对于array对象的slice函数,
返回一个数组的一段。(仍为数组)
arrayObj.slice(start, [end])
参数
arrayObj
必选项。一个 Array 对象。
start
必选项。arrayObj 中所指定的部分的开始元素是从零开始计算的下标。
end
可选项。arrayObj 中所指定的部分的结束元素是从零开始计算的下标。
说明
slice 方法返回一个 Array 对象,其中包含了 arrayObj 的指定部分。
slice 方法一直复制到 end 所指定的元素,但是不包括该元素。如果 start 为负,将它作为 length + start处理,此处 length 为数组的长度。如果 end 为负,就将它作为 length + end 处理,此处 length 为数组的长度。如果省略 end ,那么 slice 方法将一直复制到 arrayObj 的结尾。如果 end 出现在 start 之前,不复制任何元素到新数组中。
复制代码

 

var arr = ["One","Two","Three"];var arrtoo = arr.slice(0);
arrtoo[1] = "set Map";
document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,Two,Three
document.writeln("数组的新值:" + arrtoo + "<br />");//Export:数组的新值:One,set Map,Three

 

方法二:js的concat方法 

concat() 方法用于连接两个或多个数组。
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
语法
arrayObject.concat(arrayX,arrayX,......,arrayX)
说明
返回一个新的数组。该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的。如果要进行 concat() 操作的参数是数组,那么添加的是数组中的元素,而不是数组。

 

var arr = ["One","Two","Three"];var arrtooo = arr.concat();
arrtooo[1] = "set Map To";
document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,Two,Three
document.writeln("数组的新值:" + arrtooo + "<br />");//Export:数组的新值:One,set Map To,Three

 

二、对象的深浅拷贝

复制代码
var a={name:'yy',age:26};
var b=new Object();b.name=a.name;
b.age=a.age;
a.name='xx';
console.log(b);//Object { name="yy", age=26}
console.log(a);//Object { name="xx", age=26}
复制代码

就是把对象的属性遍历一遍,赋给一个新的对象。

复制代码
var deepCopy= function(source) { 
var result={};
for (var key in source) {
      result[key] = typeof source[key]===’object’? deepCoyp(source[key]): source[key];
   } return result; 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dbeaver 数据转化 mapping_Python机器学习实例:数据竞赛-足球运动员身价估计

前言1&#xff0c;背景介绍每个足球运动员在转会市场都有各自的价码。本次数据练习的目的是根据球员的各项信息和能力来预测该球员的市场价值。2&#xff0c;数据来源FIFA20183&#xff0c;数据文件说明数据文件分为三个&#xff1a;train.csv         训练集     文件…

对SQL server、Oracle、MySQL和PostgreSQL进行OLTP性能测试(Benchmark)

&#x1f4e2;欢迎点赞 &#xff1a;&#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;&#x1f4e2;本文作者&#xff1a;由webmote 原创&#xff0c;首发于 【掘金】&#x1f4e2;作者格言&#xff1a;生活在于…

【完整版】当大师遇到了理工男,只能吐血了...

全世界有3.14 % 的人已经关注了爆炸吧知识1、青年问禅师&#xff1a;“大师&#xff0c;我很爱我的女朋友&#xff0c;她也有很多优点&#xff0c;但是总有几个缺点让我非常讨厌&#xff0c;有什么方法能让她改变&#xff1f;”禅师浅笑&#xff0c;答&#xff1a;“方法很简单…

[FW]软件开发中的11个系统思维定律

“我会更加努力地工作”——一匹名叫Boxer的马&#xff08;出自乔治奥威尔的《动物农庄》&#xff09; 彼得圣吉在其著作《第五项修炼》中提到的系统思维定律同样适用于软件开发。 1. 今日的问题源于昨日的解决方案&#xff08;Today’s problems come from yesterday’s sol…

5单个编译总会编译全部_VS2019 v16.5 MSVC编译器后端更新汇总

MSVC更新汇总在Visual Studio 2019 v16.5中&#xff0c;我们已经对C后端进行了持续的改进更新&#xff0c;包括新增了一些新特性和优化点&#xff0c;编译时间优化&#xff0c;以及更好的安全性。下面我们来汇总一下目前关于MSVC编译器后端更新的要点&#xff1a;> Intel JC…

LinkedIn已将可自定义的索引引擎IndexTank开源

LinkedIn已将IndexTank开源&#xff0c;这是一种运行在云中的文档索引引擎&#xff0c;它让用户可以自定义编制索引的过程&#xff0c;并对结果进行微调。 IndexTank是在一年之前发布的&#xff0c;在十月份被LinkedIn收购&#xff0c;并在最近开放了源代码。IndexTank是与Goog…

计算机职称 计算机二级证,国家计算机二级证书含金量有多高

首先感谢你的邀请&#xff0c;我们都知道在大学生涯考证中&#xff0c;计算机二级#计算机二级#基本是在校大学生必备的证书。当然我说的必考证书是针对已经了解计算机证书的&#xff0c;当然可能还有一些人不了解&#xff0c;那学姐简单来说一下&#xff0c;什么是全国计算机二…

无法使用此安装程序来安装 .net framework_NuGet是什么?理解与使用(上)

如果你了解python&#xff0c;那么它类似pip。如果你了解nodejs&#xff0c;那么它类似npm。如果你了解ruby&#xff0c;那么它类似gem。对&#xff0c;它就是一个包&#xff08;package&#xff09;管理平台&#xff0c;确切的说是 .net平台的包管理工具&#xff0c;它提供了一…

NoSQL 是否可以用来做日志中心 ?

咨询区 ikrain&#xff1a;请问大家在分布式程序中用 nosql 来做日志中心的经验&#xff1f;我做了一些研究&#xff0c;发现用 Mongodb 做日志中心是一个非常好的选择&#xff0c;而且我发现 log4net 对它也是直接集成的&#xff0c;比如: log4mongo-net 。不知道大家可推荐这…

effective C++ 条款 3:尽可能使用const

const 修饰指针&#xff1a;如果关键字const出现在星号*左边&#xff0c;表示被指物是常量&#xff0c;如果const出现在*右边表示指针自身是常量&#xff0c; 如果出现在两边表示被指物和指针都是常量&#xff1b; const std::vector<int>::iterator iter vec.begin(); …

为团委出书写:《打造社团品牌:请给我一个理由,让我记住你!》

前些日子&#xff0c;大学母校的棋社社长欢欢给我打电话&#xff0c;说团委要出一本论述社团发展的书&#xff0c;希望我这个老社长代表翰轩棋社写一篇文字&#xff0c;说最好要5000字&#xff0c;我当时觉得压力巨大&#xff0c;现在经过几个日夜终于写出来了&#xff0c;没想…

长能耐了?想造反了?你老婆没了.......

1 提出问题的人一律直接解决掉▼2 今年的心理阴影是金字塔和钢琴键带来的▼3 广州考如何催收房租&#xff1f;▼4 想起了大雄的衣柜......▼5 这简直一毛一样▼6 我今天非要跳上去不可&#xff01;突然想到我还有点急事&#xff0c;告辞……▼7 据说&#xff0c;有不少男…

php 无限查找下级业绩_PHP 面试踩过的坑

因为最近需要面试&#xff0c;所以特意整理了一下面试所经历的一些面试题。分享一下&#xff0c;希望对自己有用&#xff0c;也对其他人有用。尚未有答案的&#xff0c;后面会陆续更新&#xff0c;如果有补充答案的&#xff0c;也十分感激。1.get,post 的区别**显示有区别 **ge…

蓝牙Bluetooth技术手册规范下载【转】

蓝牙Bluetooth技术手册规范下载 http://www.crifan.com/summary_bluetooth_specification_download/ 【背景】 之前就已经整理和转帖了和蓝牙技术相关的一些内容&#xff1a; 【资源下载】bluetooth 协议 spec specification 蓝牙1.1、蓝牙1.2、蓝牙2.0&#xff08;蓝牙2.0EDR&…

微型计算机原理中LEA,微型计算机系统原理及应用(第2版)第2章

第二章微型计算机指令系统题2-1 试分别说明以下各指令的源操作数属于何种寻址方式。答&#xff1a;1、MOV AX ,[SP] ——寄存器间接寻址2、MOV DS ,AX ——寄存器寻址3、MOV DI ,0FF00H ——立即数寻址4、MOV BX ,[2100H] ——直接寻址5、MOV CX ,[SI5] ——变址寻址6、MOV AX …

python获取历史双色球数据_你的梦想,我来买单!Python分析双色球中奖号码竟成功获取特等奖

关于双色球的话题估计大家都听的很多&#xff0c;毕竟成本很低&#xff0c;但是收获很高。毕竟当利润达到100&#xff05;时,就有人敢于铤而走险。当利润达到200&#xff05;时,他们就敢于冒上断头台的危险。 而当利润达到300%他们就会践踏人间的一切法律。更何况是n倍的利润刺…

[恢]hdu 2147

2011-12-20 15:42:45 地址&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2147 题意&#xff1a;n*m的棋盘&#xff0c;一开始在右上角。每次只能走到左、下 或者左下。判胜败。 mark&#xff1a;简单博弈。n、m同时为奇数则败。 代码&#xff1a; # include <stdi…

分布式、微服务必须配个日志管理系统才优秀,Exceptionless走起~~~

前言在真实的项目中&#xff0c;不管是功能日志、错误日志还是异常日志&#xff0c;已经是项目的重要组成部分。在原始的单体架构&#xff0c;通常看日志的方式简单粗暴&#xff0c;直接登录到服务器&#xff0c;把日志文件拷贝下来进行分析&#xff1b;而如今分布式、微服务架…

Hotspot hotswap, who and who are best freinds

Hotspot&hotswap,whoandwhoarebestfreinds(点击这里查看ppt)java动态替换的ppt。hotspot&hotswapwhoandwhoarebestfriendsxuanxitaobao.comwhyweneedhotswap&#xff1f;主管:你在偷懒&#xff1f;汇编开发人员&#xff1a;我在编译。C开发人员:我在编译打包部署。java…

《TCP/IP详解卷1:协议》第6章 ICMP:Internet控制报文协议-读书笔记

章节回顾&#xff1a; 《TCP/IP详解卷1&#xff1a;协议》第1章 概述-读书笔记 《TCP/IP详解卷1&#xff1a;协议》第2章 链路层-读书笔记 《TCP/IP详解卷1&#xff1a;协议》第3章 IP&#xff1a;网际协议&#xff08;1&#xff09;-读书笔记 《TCP/IP详解卷1&#xff1a;协议…