先看一下下面的例子:
var arr1 = [1,2,3];
var arr2 = arr1;
arr2.push(4);
console.log(arr1);//[1,2,3,4]
明明是对arr2做了处理,为什么arr1也会跟着变呢。这是因为对象都是存在内存地址中的,虽然表面看着是复制了一个新的对象出来,实质上两者指向的还是同一个地址。操作的时候改的是地址中的数据,所以引用同一地址的数据都会跟着改变,上述的拷贝我们把它称之为浅拷贝。
有些时候我们想在拷贝的时候同事改变对象的内存地址,就需要用到深拷贝。不仅将原对象的各个属性逐个复制出去,同时将原对象各个属性所包含的对象也依次采用深拷贝的方法递归复制到新对象上,从而形成一个完全新的对象。
function deepClone(values) {
var copy;
// 处理null或undefined
if (null == values || "object" != typeof values) return values;
// 处理日期对象
if (values instanceof Date) {
copy = new Date();
copy.setTime(values.getTime());
return copy;
}
// 处理数组
if (values instanceof Array) {
copy = [];
for (var i = 0, len = values.length; i < len; i++) {
copy[i] = deepClone(values[i]);
}
return copy;
}
// 处理对象
if (values instanceof Object) {
copy = {};
for (var attr in values) {
if (values.hasOwnProperty(attr)) copy[attr] = deepClone(values[attr]);
}
return copy;
}
throw new Error ("Unable to copy values! Its type isn't supported.");
}
var obj = {
'name' : 'xiaohong',
'age' : '23'
}
var obj1 = deepClone(obj);
obj1.name = 'star';
console.log(obj.name);//xiaohong
console.log(obj1.name);//star