JavaScript数组和对象的复制
发布时间 - 2026-01-11 00:16:20 点击率:次一、数据类型

从狭义上来说,JS把所有的数据分成两大类型:基本类型和引用类型,其中基本类型包括Undefined、Null、Boolean、Number和String,引用类型为Object,常用的Array、Date、RegExp、Function等都属于Object类型。
基本型数据和引用型数据的区别之一就是,在复制变量时,基本型数据复制独立的一份新的拷贝,而引用型数据复制的是原变量的引用。下面是一个例子:
// 基本类型数据的复制 var a = 10; var b = a; // b = 10 a = 20; // a = 20, b = 10 // 引用类型数据的复制 var m = [1, 2]; var n = m; m[0] = 10; console.log(n[0]); // 10
如果我想复制引用类型本身的值而非引用,显然不能采用上面的方式。
二、数组的浅复制
浅复制是指对象(数组)被复制时,其引用字段的值不会被复制,而是复制了对应字段的引用。如:
var src = [
'alpha',
['bravo', 'chalie']
];
var dest = [];
for (var i = 0; i < src.length; i++) {
dest[i] = src[i];
}
//此时,如果改变src中的引用字段,dest中相应的字段也会被改变
src[1].push('delta');
console.log(dest[1]); // ['bravo', 'chalie', 'delta']
浅复制一般用于一维数组,即数组中不存在引用类型的情况。常用的浅复制方法有:
concat方法
var src = ['alpha', 'bravo'], dest = []; dest = dest.concat(src);
concat方法更多地被用在数组合并中,比如:
var a = ['alpha', 'bravo'], b = ['chalie', 'delta'], combine; combine = a.concat(b);
特别要指出,concat用于数组合并时,是将两个(或多个)数组中的所有元素复制到新的对象,对于大型数组来说,开销比较大。更好的办法是把后一个数组的元素复制到前一个数组中:
var src = ['alpha', 'bravo'], dest = ['chalie', 'delta']; Array.prototype.push.apply(src, dest);
slice方法
slice方法可以从已有数组中返回选定的元素,返回的是一个新数组。
var src = ['alpha', 'bravo'], var dest = src.slice(0);
三、对象的浅复制
对象的浅复制可以用for-in遍历来实现,在es6中提供了更为方便的Object.assign()方法。
var src = {name: 'fox', age: 20},
dest = null;
dest = Object.assign({}, src);
也可以使用jQuery中的$.extend,underscore中的_.extend等方法来实现对象的复制。
四、深度复制
浅复制的应用场景有限,更多情况下,我们希望能够将对象复制出一个完整的副本,这就需要用到typeof或instanof操作符来对各个字段的类型进行判断。如果某字段是基本类型的,可以直接复制。如果某字段是引用类型的,还需要对该字段的所有字段进行上述判断,这就很容易让我们考虑使用递归来实现这个功能。
function deep_copy(src, dest) {
for (var p in src) {
if (Array.isArray(src[p]) || src[p] instanceof Object) {
dest[p] = Array.isArray(src[p]) ? [] : {};
arguments.callee(dest[p], src[p]);
}else {
dest[p] = src[p];
}
}
}
在上述代码中,由于数组是特殊的对象,因此可以用for-in来遍历。
另外,还可以使用json大法:
function deep_copy_in_json(src) {
return JSON.parse(JSON.stringify(src));
}
这样做虽然比较简便,但原对象的很多属性在操作后会丢失,比如construtor属性以及对象原型中的一些方法。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# javascript
# 复制对象
# 数组复制
# javascript对象和数组
# jQuery中json对象的复制方式介绍(数组及对象)
# JavaScript数组复制详解
# JavaScript 数组的深度复制解析
# javascript 三种数组复制方法的性能对比
# Javascript 复制数组实现代码
# javascript复制对象使用说明
# js中如何复制一个对象并获取其所有属性和属性对应的值
# 原生js实现复制对象、扩展对象 类似jquery中的extend()方法
# 深入理解JavaScript中的对象复制(Object Clone)
# 改进版通过Json对象实现深复制的方法
# 的是
# 来实现
# 可以用
# 遍历
# 组中
# 这就
# 递归
# 是一个
# 我想
# 也会
# 还可以
# 让我们
# 多个
# 是指
# 很容易
# 这样做
# 两大
# 可以直接
# 可以使用
# 要对
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速完成中国万网建站详细流程?
如何确认建站备案号应放置的具体位置?
Windows Hello人脸识别突然无法使用
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
如何基于云服务器快速搭建个人网站?
中山网站推广排名,中山信息港登录入口?
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
如何用JavaScript实现文本编辑器_光标和选区怎么处理
太平洋网站制作公司,网络用语太平洋是什么意思?
如何在万网自助建站中设置域名及备案?
JS实现鼠标移上去显示图片或微信二维码
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
如何挑选高效建站主机与优质域名?
Laravel如何优化应用性能?(缓存和优化命令)
Java解压缩zip - 解压缩多个文件或文件夹实例
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
Python数据仓库与ETL构建实战_Airflow调度流程详解
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
Laravel如何为API生成Swagger或OpenAPI文档
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
如何快速登录WAP自助建站平台?
深圳网站制作的公司有哪些,dido官方网站?
Laravel如何配置Horizon来管理队列?(安装和使用)
成都网站制作公司哪家好,四川省职工服务网是做什么用?
Linux后台任务运行方法_nohup与&使用技巧【技巧】
javascript中闭包概念与用法深入理解
免费网站制作appp,免费制作app哪个平台好?
canvas 画布在主流浏览器中的尺寸限制详细介绍
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
详解jQuery中的事件
北京企业网站设计制作公司,北京铁路集团官方网站?
Python制作简易注册登录系统
香港网站服务器数量如何影响SEO优化效果?
如何选择可靠的免备案建站服务器?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
Java遍历集合的三种方式
Laravel中的Facade(门面)到底是什么原理
如何在IIS中配置站点IP、端口及主机头?
Laravel如何与Pusher实现实时通信?(WebSocket示例)
制作公司内部网站有哪些,内网如何建网站?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案

