JS深拷贝
在JS中,数据类型分为基本数据类型和引用数据类型两种,对于基本数据类型来说,它的值直接存储在栈内存中,而对于引用类型来说,它在栈内存中仅仅存储了一个引用,而真正的数据存储在堆内存中。
var one = {name:"wang"}
var two = one;
two.name = "fei";
alert(one.name);
深拷贝不会拷贝引用类型的引用,而是将引用类型的值全部拷贝一份,形成一个新的引用类型,这样就不会发生引用错乱的问题,使得我们可以多次使用同样的数据,而不用担心数据之间会起冲突
解决方法
<1>Object.assign()
var one = { name:"wang"}
var two = Object.assign({},one);
two.name = "fei";
alert(one.name);
补:{…one} 同理
缺点:
只适合基础的数据类型
<2>使用JSON对象的stringify和parse方法
var one = {
name:"wang",
info:{
age:20
}
}
var two = JSON.parse(JSON.stringify(one));
two.info.age = 18;
alert(one.info.age);
缺点:
不可以拷贝 undefined , function, RegExp 等等特殊类型
<3>使用递归
function deep(obj) {
//判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝
var objClone = Array.isArray(obj) ? [] : {};
//进行深拷贝的不能为空,并且是对象或者是
if (obj && typeof obj === "object") {
for (key in obj) {
//判断对象是否包含特定的自身(非继承)属性
if (obj.hasOwnProperty(key)) {
if (obj[key] && typeof obj[key] === "object") {
objClone[key] = deep(obj[key]);
} else {
objClone[key] = obj[key];
}
}
}
}
return objClone;
}