区别
对于浅拷贝和深拷贝,简单来讲的话,我声明了一个a , 然后再声明b,b拷贝a,但如果我将a进行改变,b也对于着改变,这就是浅拷贝,但是如果b没改变,那就是深拷贝了,其实底层的话,也就是,浅拷贝就是完全复杂了b复制a,但是b和a还是在一个工作区域内,但是呢,深拷贝就是就是b拷贝了a,但是b自己创建新的工作区域,虽然是一样的,但a改变后完全不会影响b
如果是基本数据类型,名字和值都会储存在栈内存中
let a = 1;
b = a;
console.log(a,b)
如果是引用数据类型,名字存在栈内存中,值存在堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值
//比如我创建一个对象a
let a = {
num1 : 1,
num2 : 2,
num3 : 3
}
//此时a将num1,num2,num3放进堆里面
//我再创建一个空对象b
let b = {}
//如果我将b克隆a
//这时b完全可以向a那个堆里面去拿数据
//如果将a对象里面的数据改变,同时也改变了堆里面的数据,相对于b也要随之a的改变而改变
如何去实现浅拷贝和深拷贝
浅拷贝
//第一种
function clone(oldobj){
if(oldobj){
return null
}
if(typeof oldobj !== "Object"){
return oldobj
}
let newobj = Array.isArray(oldobj) ? [] : {};
for(let key in newobj){
newobj[key] = oldobj[key]
}
return newobj
}
//第二种
let obj = {
a : 1,
b : 2
}
let obj1 = Object.assign(obj)
深拷贝
//第一种
function clone(oldobj){
let newobj = Array.isArray(oldobj) ? [] : {};
for(let key in newobj){
if(typeof oldobj !== "Object"){
newobj[key] = oldobj[key]
}else{
newobj[key] = clone[oldobj[key]]
}
}
return newobj
}
//第二种
function clone1(obj){
let _obj = JSON.stringify(obj);
newobj = JSON.parse(_obj);
return newobj
}