js中的数组拷贝(浅拷贝,深拷贝) js深拷贝数组对象
liuian 2024-12-23 12:10 59 浏览
问题
写代码时需要拷贝一个内容会变化的数组,使用了=赋值,slice(),concat()方法都不行,修改了原数组后拷贝数组也变了,原因是这个数组内容是object,而object是引用类型,需要使用深拷贝,最后使用var newArr = JSON.parse(JSON.stringify(arr));解决
浅拷贝&深拷贝
- 浅拷贝:如果数组元素是基本类型,就会拷贝一份,互不影响,而如果是对象或者数组,就会只拷贝对象和数组的引用,无论对新旧数组的哪一个进行了修改,两者都会发生变化。
- 深拷贝:完全的拷贝一个对象,即使嵌套了对象,两者也相互分离,修改一个对象的属性,也不会影响另一个。
var arr = [{name: 'wens'},{age: '26'}]; //原数组
var newArr1 = arr; //浅拷贝
var newArr2 = arr.slice(); //浅拷贝
var newArr3 = arr.concat(); //浅拷贝
var newArr4 = JSON.parse(JSON.stringify(arr)); //深拷贝
arr[0].name = 'leon';
arr[1].age = '27';
console.log(arr);
console.log(newArr1);
console.log(newArr2);
console.log(newArr3);
console.log(newArr4);运行结果:
浅拷贝
1.使用=直接赋值
var newArr = arr;
缺点:由于数组是引用类型,修改了arr或者newArr中的一个会影响全部
2.使用slice()
var newArr = arr.slice();
3.使用concat()
var newArr = arr.concat();
slice()和concat()缺点:当数组内部属性值为引用对象时,使用slice和concat对对象数组的拷贝,整个拷贝还是浅拷贝,拷贝之后数组各个值的指针还是指向相同的存储地址。简单来说就是:
数组中的值如果是引用类型,对其进行增删改,会影响用slice复制的数组,
但是如果数组中的值是基本类型,就不会影响
深拷贝
1.使用JSON.stringify和JSON.parse
不仅可拷贝数组还能拷贝对象(但不能拷贝函数)
var newArr = JSON.parse(JSON.stringify(arr));
缺点:JSON.stringify()有一些局限,比如对于RegExp类型和Function类型则无法完全满足,而且不支持有循环引用的对象。
2.深拷贝的一个通用方法
实现思路:拷贝的时候判断属性值的类型,如果是对象,继续递归调用深拷贝函数
var deepCopy = function(obj) {
// 只拷贝对象
if (typeof obj !== 'object') return;
// 根据obj的类型判断是新建一个数组还是一个对象
var newObj = obj instanceof Array ? [] : {};
for (var key in obj) {
// 遍历obj,并且判断是obj的属性才拷贝
if (obj.hasOwnProperty(key)) {
// 判断属性值的类型,如果是对象递归调用深拷贝
newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];
}
}
return newObj;
}相关推荐
-
- 教务网络管理系统入口(内蒙古民族大学教务网络管理系统入口)
-
钟山学院官网http://www.zscollege.com/钟山学院教务处http://jwc.njzs.edu.cn/钟山学院教务处学生登录入口http://jwgl.zscollege.com/jwweb/(网站左侧)三江学院的...
-
2025-12-28 02:05 liuian
- win10系统下载32位纯净版(下载windows10纯净版)
-
纯净版就是最干净的版本,也叫最绿色的版本。像WIN系统通常会有纯净版、快速安装版、精简版、定制版、Ghost版等。纯净版就是只配套提供了最最基础的软件和功能,一些高级一点的功能或软件需要自己另外安装,...
- 联想主板进入bios的方法(联想台式机怎么进入bios)
-
联想电脑开机一直按F2,就可以进入BIOS,部分机型需要按Fn+F2。BIOS是英文BasicInputOutputSystem的缩略词,直译过来后中文名称就是基本输入输出系统,在IBMPC兼...
- win7升级win10数据还在吗(win7升级成win10上面的数据还有吗)
-
在升级Windows7到Windows10的过程中,可以选择保留个人文件和应用程序,但是不保证所有数据都能完全保留。如果您选择“保留个人文件和应用程序”选项,Windows10安装...
- win7怎么升级到windows10(win7怎么升级到win11系统)
-
Win7不够8G内存怎么升级到win10。朋友也就是说你现在在使用win7系统。内存不够8G那就是4G的呀。Windows10最低配置的内存就是4G。所以说你要把windows7升级为window...
- 手机桌面图标隐藏了怎么弄出来
-
答:手机恢复隐藏的手机图标操作步骤如下:1.首先将手机解锁后进入华为手机的桌面,双指按住桌面的上方和下方,然后由内向外滑动屏幕,呼出隐藏空间。2.在新出现的页面中,可以查看已经被隐藏的应用。3.在列出...
- lol游戏崩溃是什么原因(lol游戏崩溃的原因)
-
1.试试重启电脑,或者是重新启动游戏。2.如果卡死了可以稍微等一下,会自动恢复。3.卡死的情况如果可以打开任务管理器,查看cpu、显卡、内存的占用率,如果异常查看对应的驱动是否正常,如果占用率都正常温...
- 视频工具箱怎么打开(小米视频工具箱怎么打开)
-
原因:系统默认隐藏了,需重新设置。方法/步骤1.点击特色功能在设置界面,点击特色功能。2.点击视频工具箱在特色功能界面,点击视频工具箱。3.开启视频工具箱在视频工具箱界面,开启视频工具箱即可。红米的视...
- win7 win10配置要求(win10 win7哪个要求配置高)
-
要求不算高,处理器双核2.0ghz以上,4gb内存,512兆显存的显卡,这个是流畅运行Win10的基本要求。但是现在的电脑硬件性能已经远高于以上的配置,所以不用担心升级Win10后是否会卡顿的问题。不...
- 台式电脑配置低怎么升级(台式电脑配置升级需要换哪些东西)
-
1.首先查看电脑主板规格,如果规格太落后,就需要升级主板,如果主板规格较新,可以主板规格下升级其他配件2.在主板规格不变的情况下,优先升级CPU,提升CPU主频3.加大内存规格。如果主板支持的话,可以...
- win10突然桌面的东西都没了(windou10桌面东西突然没了)
-
win10看不到正常桌面演示机型:联想GeekPro2020(系统版本:Windows10)win10看不到正常桌面是因为桌面系统图标被隐藏了,可以在个性化的主题设置中找到“桌面图标设置”,并点击...
-
- 下载清除手机垃圾免费软件(华为自带清理软件)
-
手机垃圾清理软件排行:1、LBE安全大师对于这个软件,大伙都熟悉吧,它在清理手机垃圾方面很有研究,是安卓平台上首款主动式防御软件,也是第一款具备实时监控与拦截能力的安全软件,因此,深受大家的青睐和喜欢。2、猎豹清理大师猎豹清理大师(原金山清...
-
2025-12-27 20:55 liuian
- 电脑技术咨询(电脑技术在线咨询)
-
华为电脑关闭热门咨询的步骤如下:打开设置,然后找到通知和状态栏,点击通知智能管理,在找到有资讯热点的应用,然后关闭锁屏通知。华钜同创跨境电商服务(深圳)有限公司华钜同创跨境电商服务(深圳)有限公司成立...
- dell笔记本推荐(dell笔记本电脑推荐)
-
灵越16plus 定位是全能本,拥有游戏本的性能,外观重量接近轻薄本,散热好,满足主流设计软件使用,玩中小型游戏无压力,还有硬件防蓝光屏幕保护眼睛~成就5320性能颜值在线,日常办公使用...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
