首先要清楚js的数据类型,和存储方式(栈,堆)。
对象的赋值其实是将对象名存储在栈中,对应存储的值为堆中数据的引用指针。
基本数据类型的存储则是直接存储在栈中。
浅拷贝:如果对象的属性的值为对象,则保存的为对象的指针,修改指针指向对象的值,则两个对象均会发生变化
Object.assign({},obj1,obj2)
obj = {...obj1}
深拷贝:两个对象互相不干扰,修改值不会有影响
1、obj1 = JSON.parse(JSON.stringify(obj2)) 这种方法只能深拷贝对象和数组,不能拷贝函数,循环引用(就是在对象的属性对应的值为对象本身),还不能拷贝(Date,RegExp,Error)
2、for in 循环递归
function deepClone(obj){
if(typeof obj ==='object'){
//判断obj类型,这里只考虑对象和数组
//typeof 返回的值有7种,均为字符串类型 number,string,boolean,undefined symbol,function,object
const objClone = Array.isArray(obj)?[]:{};
for(let key in obj){
if(obj.hasOwnProperty(key)){
objClone[key] = deepClone(obj[key])
}
}
return objClone
}else{
//如果不是上面两种类型直接返回
return obj
}
}
先写到这
来源:https://www.cnblogs.com/yangdakuan/p/12262594.html