不管其他博客上有多少总结到位,通俗易懂的博客和个例,知识还是别人的,并没有到你的肚子里面去。所以自己尽量不去搜索引擎里面Ctrl C,Ctrl V。上网查资料搞懂了之后,写个例子跑起来,没事就看看,这样的东西才是“深拷贝”。
首先看下面的例子:
var objectA = {
a:1,
b:2,
c:3
};
var objectB = objectA;
objectB.c=10;
console.log(objectA.c); //10
上面现象的原因是对象传的是引用,objectA和objectB指向的是同一片内存
对象的浅拷贝和深拷贝的区别:浅拷贝基础的数据类型可以拷贝,深拷贝是拷贝对象中所有的部分,为对象中所有的东西重新开辟了一块地址。
下面浅拷贝的一种(Object.assign()):
var object1 = {
sex:"male",
age:20,
friends:["liu","huang"],
obj: {
a:1
}
};
var objectFunction = Object.assign({},object1); /*注意:js区分大小写*/
objectFunction.friends[0] = "function";
console.log(objectFunction.friends[0]); //function
console.log(object1.friends[0]); //function,被改变
objectFunction.obj.a=10000;
console.log(objectFunction.obj.a); //10000
console.log(object1.obj.a); //10000,被改变
下面是深拷贝的两种方法:
1, JSON
var object1 = {
sex:"male",
age:20,
friends:["liu","huang"]
};
var object2=JSON.parse(JSON.stringify(object1));
//parse:将字符串转换为JSON格式,stringify:将object转换为字符串。这个过程开辟了新地址
object2.friends[0] = "JSON";
console.dir(object1);
console.dir(object2);
2, 递归函数
function f(base,copy)
{
var copy = copy || {};//初始化拷贝的对象,开辟一块新地址
for(var i in base)//遍历对象的所有子节点
{
if(typeof base[i] ==='object')
{
if(base[i].constructor===Array)
copy[i] = [];
else
copy[i] = {};
arguments.callee(base[i],copy[i]); //***********************递归调用
}
else
{
copy[i]=base[i];
}
}
return copy;
}
var temp;
var object3 = f(object1,temp);
object3.friends[0] = "deep";
console.dir(object3);
console控制台结果如下:分别为object1,object2(JSON方法),object3(递归函数方法)