一、数组和对象的浅拷贝
简单的赋值就是浅拷贝。数组和对象在赋值的时候都是引用传递,只是传递一个指针。
var a = [1,2,3];
var b =a ;
var c = {name:'xuyafei', age:26};
var d = c;
console.log(a);
console.log(b);
console.log(c);
console.log(d);
console.log('----------------------------');
b[0] =5;
c.age = 27;
console.log(a);
console.log(b);
console.log(c);
console.log(d);
输出结果如下:
[1,2,3]
[1,2,3]
{ name: 'xuyafei', age: 26 }
{ name: 'xuyafei', age: 26 }
----------------------------
[5,2,3]
[5,2,3]
{ name: 'xuyafei', age: 27 }
{ name: 'xuyafei', age: 27 }
二、数组的深拷贝
方法一:js的slice函数
array对象的slice函数:arrayObj.slice(start, [end])
返回值
返回一个 Array 对象,其中包含了 arrayObj 的指定部分。(仍为数组)
参数
arrayObj:必选项。一个 Array 对象。
start:必选项。arrayObj 中所指定的部分的开始元素是从零开始计算的下标。
end:可选项。arrayObj 中所指定的部分的结束元素是从零开始计算的下标。
说明
slice 方法一直复制到 end 所指定的元素,但是不包括该元素。
如果 start 为负,将它作为 length + start处理。如果 end 为负,就将它作为 length + end 处理,此处 length 均为数组的长度。
如果省略 end ,那么 slice 方法将一直复制到 arrayObj 的结尾。
如果 end 出现在 start 之前,不复制任何元素到新数组中。
例子代码如下
var arr = ["One","Two","Three"];
var arrtoo = arr.slice(0);
arrtoo[1] = "set Map";
document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,Two,Three
document.writeln("数组的新值:" + arrtoo + "<br />");//Export:数组的新值:One,set Map,Three
方法二:js的concat方法
concat() 方法用于连接两个或多个数组,该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
语法
arrayObject.concat(arrayX,arrayX,......,arrayX)
说明
返回一个新的数组。该数组是通过把所有 arrayX 参数元素添加到 arrayObject 中生成的。如果要进行 concat() 操作的参数是数组,那么添加的是数组中的元素,而不是数组。
还是不太明白?看看下面的例子就明白很多了
var arr = ["One","Two","Three"];
var arrtooo = arr.concat();
arrtooo[1] = "set Map To";
document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,Two,Three
document.writeln("数组的新值:" + arrtooo + "<br />");//Export:数组的新值:One,set Map To,Three
三、对象的深拷贝
代码中聊
var a={name:'yy',age:26};
var b=new Object();
b.name=a.name;
b.age=a.age;
a.name='xx';
console.log(b);//Object { name="yy", age=26}
console.log(a);//Object { name="xx", age=26}
//就是把对象的属性遍历一遍,赋给一个新的对象。即:
var deepCopy= function(source) {
var result={};
for (var key in source) {
result[key] = typeof source[key]===’object’? deepCoyp(source[key]): source[key];
}
return result;
}
参考