因为javascript分原始类型与引用类型(与java、c#类似)。Array是引用类型,所以直接用=号赋值的话,只是把源数组的地址(或叫指针)赋值给目的数组,并没有实现数组的数据的拷贝。另外对一维数组和多维数据的深拷贝实现方式是不一样的,下面分别讨论。

  一、 错误实现  

var array1 = new Array("1","2","3");
var array2;
array2 = array1;
array1.length = 0;
alert(array2); //返回为空

这种做法是错的,因为javascript分原始类型与引用类型(与java、c#类似)。Array是引用类型。array2得到的是引用,所以对array1的修改会影响到array2。

  二、 一维数组的实现方式:

  使用slice() 或者 concat()来实现一维数组的深拷贝,但这种方法只适用于一维数组,对多维数组无效。

  可使用slice()进行复制,因为slice()返回也是数组。  

var array1 = new Array("1","2","3");
var array2;
array2 = array1.slice(0);
array1.length = 0;
alert(array2); //返回1、2、3

  注意concat()返回的并不是调用函数的Array,而是一个新的Array,所以可以利用这一点进行复制。

var array1 = new Array("1","2","3");
var array2;
array2 = array1.concat();
array1.length = 0;
alert(array2); //返回1、2、3

  三、 多维数组的JS函数实现方式:

    function deepcopy(obj) {
var out = [],i = 0,len = obj.length;
for (; i < len; i++) {
if (obj[i] instanceof Array){
out[i] = deepcopy(obj[i]);
}
else out[i] = obj[i];
}
return out;
}      //下面是测试代码 
var weekArray = new Array(7);//数组第一维
var timeTableArray = new Array(); //数组第二维
var lineArray = new Array(4); //数组第三维 lineArray[0] = "1_a";
lineArray[1] = "1_b";
lineArray[2] = "1_c";
timeTableArray.push(lineArray);
weekArray[0] = deepcopy(timeTableArray); //清空,并添加其他星期的数据
lineArray.splice(0,lineArray.length);
timeTableArray.splice(0,timeTableArray.length); lineArray[0] = "7_a";
lineArray[1] = "7_b";
lineArray[3] = "7_d";
timeTableArray.push(lineArray);
weekArray[7] = deepcopy(timeTableArray); alert("weekArray=" + weekArray[0]);//返回 "1_a,1_b,1_c,"
alert("weekArray=" + weekArray[7]);//返回 "7_a,7_b,,7_d"

  四、 多维数组的jquery实现方式:

  把上述的deepcopy函数用下面的函数替代即可

  weekArray[0] = $.extend(true, {}, timeTableArray);

来源:http://www.cnblogs.com/matthew-2013/p/3524297.html

JS中多维数组的深拷贝的多种实现方式的更多相关文章

  1. js 中多维数组的深拷贝的多种实现方式

    因为javascript分原始类型与引用类型(与java.c#类似).Array是引用类型,所以直接用=号赋值的话,只是把源数组的地址(或叫指针)赋值给目的数组,并没有实现数组的数据的拷贝.另外对一维 ...

  2. js中多维数组转一维

    法一:使用数组map()方法,对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组. var arr = [1,[2,[[3,4],5],6]]; function unid(arr){ v ...

  3. js中对arry数组的各种操作小结

    最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以说啊,为了在以后的工作中写出最优化的代码,我 ...

  4. js中的伪数组

    一, 伪数组 1. 具有length属性 2. 按索引方式存储数据 3. 不具有数组的方法, 比如push(),pop()等 二, 生成伪数组的方法 在js中生成伪数组的方法比较多 1. functi ...

  5. js中字符串与数组的相互转换

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  6. js中对arry数组的各种操作小结 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据 web前端url传递值 js加密解密 HTML中让表单input等文本框为只读不可编辑的方法 js监听用户的键盘敲击事件,兼容各大主流浏览器 HTML特殊字符

    js中对arry数组的各种操作小结   最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以说啊 ...

  7. js课程 3-10 js中字符串函数数组函数和其它语言中对应函数的区别和联系是什么

    js课程 3-10  js中字符串函数数组函数和其它语言中对应函数的区别和联系是什么 一.总结 一句话总结:js中是对象点方法的形式,这些方法都是对象的方法,而在php.java中却不是这样. 1.j ...

  8. js中构造函数的原型添加成员的两种方式

    首先,js中给原型对象添加属性和方法. 方式一:对象的动态特效 给原型对象添加成员 语法:构造函数.prototype.方法名=function (){ } 方式二:替换原型对象(不是覆盖,而是替换, ...

  9. JS中如何进行对象的深拷贝

    在JS中,一般的=号传递的都是对象/数组的引用,并没有真正地拷贝一个对象,那如何进行对象的深度拷贝呢?如果你对此也有疑问,这篇文章或许能够帮助到你 一.对象引用.浅层拷贝与深层拷贝的区别 js的对象引 ...

随机推荐

  1. !!!常用SVG代码

    http://www.w3school.com.cn/svg/svg_examples.asp svg实例 http://www.w3school.com.cn/svg/svg_reference.a ...

  2. 最简单的cmd命令行取得系统路径和python的安装路径(适用于winxp.win7和win10)

    @echo off::pip install seleniumpython -c"import sys;print(sys.prefix)" >temp.txtfor /f ...

  3. source tree常用功能

    参考地址: https://blog.csdn.net/weixin_39568744/article/details/81413198

  4. Eclipse 如何查看源代码

    Eclipse 关联源代码:

  5. keepalive高可用

    Keepalived软件起初是专门为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能.因此,Keepalived除了能够管理LVS软 ...

  6. Windows 配置nginx服务器 运行php项目

    1下载 http://nginx.org/en/download.html 选择稳定版下载. 2 解压后 直接双击nginx.exe 双击后一个黑色的弹窗一闪而过 3 修改配置文件nginx.conf ...

  7. VueJs相关命令

    参考: https://www.jianshu.com/p/1626b8643676   安装axios $ npm install axios   如何打包 基于Vue-Cli,通过npm run ...

  8. Spring Boot+Quartz实现一个实时管理的定时任务

    转载 https://www.cnblogs.com/wujiwen/p/9615120.html 项目实践过程中碰到一个动态管理定时任务的需求:针对每个人员进行信息的定时更新,具体更新时间可随时调整 ...

  9. Error running Tomcat8: Address localhost:xxxx is already in use

    参考自: https://blog.csdn.net/huazhongkejidaxuezpp/article/details/41813683 第一步,命令提示符号,执行命令:netstat -an ...

  10. Spring事务管理的配置

    spring-datasource-config.xml配置事务 <bean id="txManager" class="org.springframework.j ...