浅拷贝和深拷贝

浅拷贝:是拷贝基本类型的值,拷贝对象类型(也叫引用数据类型)的地址,只拷贝一层
深拷贝:除了拷贝基本类型的值,还完全复刻了对象类型,等于创建新对象,可拷贝多层

方法:
1.Object.assign(目标对象,源对象)
对象的属性值是基本类型,就是深拷贝;对象的属性值是引用类型,就是浅拷贝

2.JSON.parse(JSON.stringify(obj))
可多层深拷贝,但拷贝function会报错,有坑,无法适用全部场景

3.拓展运算符…

let a = {key1: 1}; let b = {...a}//和Object.assign一样

4.递归方式(推荐)

const obj = {a:'1', b:{bb:'2'}, c:['3','4']}
//封装深拷贝函数
function CloneDeep(oldObj){
	const newObj = Array.isArray(Obj) ? [] : {} //先判断拷贝的是数组还是对象
	for(let k in oldObj){ //开始遍历拷贝属性和值
		if(typeof oldObj[k] === 'object'){
			newObj[k] = CloneDeep(oldObj[k]) //若是引用数据类型就递归遍历再次拷贝
		}else{
			newObj[k] = oldObj[k] //否则直接拷贝基本类型的值
		}
	}
	return newObj
}
const myObj = CloneDeep(obj)
connsole.log(myObj)

补充:声明基本类型的变量会存储在栈内存当中;声明引用类型的变量会在堆内存中分配一块空间,同时在栈中也会保存一个引用地址用来指向这一块空间。
浅拷贝和深拷贝_第1张图片
参考
参考

你可能感兴趣的:(面试,javascript)