因为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. java利用泛型实现不同类型可变参数

    public class VP { public <T> void printMsg(T... args){ for (T t:args){ System.out.println(&quo ...

  2. GIT BRANCHING

    GIT BRANCHING generalizations Let's take a moment to review the main concepts and commands from the ...

  3. svn的下载及安装

    什么是SVN: SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. SVN的下载安装: 下载地址:https: ...

  4. NodeJs学习相关网址

    node官方中文 https://nodejs.org/zh-cn/   Node.js 中文网 https://nodejs.org/zh-cn/   Node.js 教程 | 菜鸟教程 http: ...

  5. python狂犬病大数据分析

    一.被动物咬伤.抓伤者,年龄以45-59岁年龄组为最多(占30.66%). 45-59岁年龄段的人与动物接触较多.被侵害的机会最多.其次受伤机会较多的是15-44岁年龄阶段的人,而7岁及以下儿童受伤比 ...

  6. Linux redhat 7 进入单用户模式

    redhat  7 进入单用户模式修复系统故障 1.启动机器,grub界面选择第一个,按e 2.往下翻,找到Linux16 开头的那一行 3.将ro改为"rw init=/sysroot/b ...

  7. CentOS7配置samba服务

    Step1:安装samba相关软件 [root@node-1 ~]# yum -y install samba samba-client Step2:创建共享目录 [root@node-1 ~]# m ...

  8. 151. Reverse Words in a String翻转一句话中的单词

    [抄题]: Given an input string, reverse the string word by word. Example: Input: "the sky is blue& ...

  9. 激活prompt

    1.下载SQLPrompt 2. 断网, 打开注册机,拷贝验证码 2. 点击activate, 拷贝代码

  10. centos7 smplayer 安装 安装视频播放器

    # yum -y install http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noar ...