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版本升级流程与兼容性处理  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案