一、数组的深浅克隆
在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);