使用slice和concat对对象数组的拷贝,整个拷贝还是浅拷贝,拷贝之后数组各个值的指针还是指向相同的存储地址。
因此,slice和concat这两个方法,仅适用于对不包含引用对象的一维数组的深拷贝
如果数组内部属性值为引用对象,应该使用jquery的$.extend()实现对象和数组的深拷贝。
方法如下:
// 浅层复制(只复制顶层的非 object 元素) var newObject = jQuery.extend({}, oldObject); // 深层复制(一层一层往下复制直到最底层) var newObject = jQuery.extend(true, {}, oldObject);
测试用例:
var obj1 = {
'a': 's1',
'b': [1,2,3,{'a':'s2'}],
'c': {'a':'s3', 'b': [4,5,6]}
}
var obj2 = $.extend(true, {}, obj1);
obj2.a='s1s1';
obj2.b[0]=100;
obj2.c.b[0]=400;
console.log(obj1);
console.log(obj2);
obj2 内部元素的值改变之后,如果 obj1 的相应值保持不变,就说明复制成功。
则数组的深拷贝方法如下:
var newArr = $.extend(true,[],oldArr);
当在一个循环中,我们不断地更新oldArr,并且调用$.merge()合并oldArr时,代码如下:
for(var i=0;i<len;i++){
........
var deepCopiedData = $.extend(true, [], oldArr);
$.merge(listData,oldArr);
deepCopiedData =null;
}
附一道js数组复制的题目:
题目描述
在数组 arr 末尾添加元素 item。不要直接修改数组 arr,结果返回新的数组
输入例子:
append([1, 2, 3, 4], 10)
输出例子:
[1, 2, 3, 4, 10]
function append(arr, item) {
var newarr=arr.slice(0);
newarr.push(item);
return newarr;
}