Js中的深浅克隆

一、数组的深浅克隆

  在js中,我们有时对数组进行操作时需要先对原有数组进行备份,如果只是通过将数组对象复制给一个变量,那么当改变新的数组的元素值时同时也会改变备份数组的值,这就是浅克隆。可以看下下面的例子:

var arr1 = [1, 2, 3, 4, 5, 6];
var arr2 = arr1;
arr2[1] = 10;

alert(arr1);//1,10,3,4,5,6

alert(arr2);//1,10,3,4,5,6

大多数时候,这不是我们希望的结果,那么能如何实现对原有数组的深度克隆呢?!这时我们可以通过数组对象的两个方法来实现:

1、js的slice(a,[b])函数

  返回值也是一个数组,不过是进行了截取的数组。

有两个参数

a 必选项 表示开始位置的数组元素的索引

b 可选项 表示结束位置的数组元素的索引(注:截取的数组包含该索引处的数组元素) 

说明:

slice 方法返回一个 Array 对象,其中包含了 arrayObj 的指定部分。
slice 方法一直复制到 end 所指定的元素,但是不包括该元素。如果 start 为负,将它作为 length + start处理,此处 length 为数组的长度。如果 end 为负,就将它作为 length + end 处理,此处 length 为数组的长度。如果省略 end ,那么 slice 方法将一直复制到 arrayObj 的结尾。如果 end 出现在 start 之前,不复制任何元素到新数组中。
var arr = ["One", "Two", "Three"];

var arr2 = arr.slice(0);
arr2[0] = "test";
alert(arr);//"One", "Two", "Three"
alert(arr2);//"test", "Two", "Three"

2、js的Concat()方法

concat()用于连接两个或多个数组

该方法不会改变原有数组,紧紧会返回被连接数组的一个副本。

语法:

arrayObject.concat(arrayX,arrayX,......,arrayX)

说明:

返回一个新数组。该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的。如果要进行 concat() 操作的参数是数组,那么添加的是数组中的元素,而不是数组。

var arr = ["One", "Two", "Three"];

var arr2 = arr.concat();
arr2[0] = "test";
alert(arr);//"One", "Two", "Three"
alert(arr2);//"test", "Two", "Three"

二、对象的克隆

对象的克隆就是把对象的属性遍历一遍然后赋值给新的对象

var json = { a: 9, b: 8, c: {d:7,e:6}};

        var deepcopy = function (sourceObj)
        {
            var obj = {};
            for(var i in sourceObj)
            {
                obj[i] = sourceObj[i];
            }

            return obj;
        }

var res=deepcopy(json);
原文地址:https://www.cnblogs.com/YanYongSong/p/5305405.html