js中变量包含两种数据类型 基本数据类型和引用数据类型
浅拷贝的小例子
let a = [0, 1, 2, 3, 4],
b = a;
a[0] = 1;
console.log(a, b);
b复制了a,修改数组a,数组b也跟着变了,
a,如果我们
let a = 1 ; 当你 b = a 的时候 栈内存会开辟一个内存 不会互相影响
b, 如果我们
let a = [1,2,3,4] 当你b=a 的时候 实在复制a的 引用地址
当我们a[0]=1 由于a和b指向的一个地址 b也会跟着修改 这就是 所谓的浅拷贝
c, 如果我们
在内存中 也来开辟一个新的内容 来存放b的值 也就是我们所说的深拷贝
一个深拷贝的函数
function deepClone(obj){
let objClone = Array.isArray(obj)?[]:{};
if(obj && typeof obj==="object"){
for(key in obj){
if(obj.hasOwnProperty(key)){
//判断ojb子元素是否为对象,如果是,递归复制
if(obj[key]&&typeof obj[key] ==="object"){
objClone[key] = deepClone(obj[key]);
}else{
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
let a=[1,2,3,4],
b=deepClone(a);
a[0]=2;
console.log(a,b);
现在b脱离了a的控制 不再受a影响
除了递归,我们还可以借用JSON对象的parse 和stringify
function deepClone(obj){
let _obj = JSON.stringify(obj),
objClone = JSON.parse(_obj);
return objClone
}
let a=[0,1,[2,3],4],
b=deepClone(a);
a[0]=1;
a[2][0]=1;
console.log(a,b);
JSON.stringify 与JSON.parse 除了实现深拷贝 还能结合 localStorage实现对象数组存储