JavaScript深拷贝和浅拷贝数组

Posted 梦Dreamer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript深拷贝和浅拷贝数组相关的知识,希望对你有一定的参考价值。

javascript分原始类型与引用类型(与java、c#类似)。Array是引用类型,直接用“=”号赋值的话,只是把源数组的地址(或叫指针)赋值给目的数组,并没有实现数组的数据的拷贝。这种方式的实现属于浅拷贝。 对一维数组和多维数据的深拷贝实现方式是不一样的。  一、一维数组的实现方式:   使用slice() 或者 concat()来实现一维数组的深拷贝, 但这种方法只适用于一维数组,对多维数组无效。   arrayObj.slice(start,[end]): 可使用slice()进行复制,因为slice()返回也是数组。 slice方法是通过参数start和end的传入值来返回数组中的一段,该方法不对原数组进行操作。slice(0)代表返回所有项。
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);

以上是关于JavaScript深拷贝和浅拷贝数组的主要内容,如果未能解决你的问题,请参考以下文章

javascript深拷贝和浅拷贝以及实现方法(推荐)

Javascript中的深拷贝和浅拷贝

[转] js深拷贝和浅拷贝

day09 - JavaScript有关数组和对象的的深拷贝和浅拷贝问题

JavaScript深拷贝和浅拷贝的区别

Javascript学习之深拷贝和浅拷贝详解