js面试必备:浅拷贝和深拷贝

浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。
深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。
浅拷贝包括直接拷贝内存地址(比如:= 赋值),或者拷贝一层,深层的引用类型只是拷贝内存地址。
浅拷贝实现:
1、for循环遍历(拷贝一层)

function copy(obj){
	let newObj = {}
	for(let key in obj){
		newObj[key] = obj[key]
	}
	return obj
}
let obj = {a:{b:2}}
let newobj = copy(obj);
newobj.a.b =1
console.log(obj);
console.log(newobj);

2 、Ojbect.assign实现浅拷贝

let i = {a:{},b:2,c:3}
let j = Object.assign([],i);
j.a.d =1  
console.log(i);
console.log(j); 

两种有个共同点:就是对象的第一层是深拷贝,但第二层开始如果是引用类型都是拷贝地址,而不是拷贝对象。
深拷贝实现:
1通过JSON.stringify转换为字符串再转换回来

let a = {a:1,b:2,c:3}
let b = JSON.parse(JSON.stringify(a))

缺点:1、抛弃了对象的constructor ,即没有构造函数
2、Date对象, RegExp对象, Error对象等是无法通过这种方式深拷贝
3、NaN会变成null,undefind会直接被丢弃
2递归实现

function deepclone(initalObj,cloneObj){//要拷贝的对象,新对象
let newObj = cloneObj ? cloneObj : {};
for(let i in initalObj){
	if(typeof initalObj[i] === "object"){
		if(initalObj[i].constructor === Array ? [] : {}){
			deepclone(initalObj[i],newObj[i]);
		}
	}
	newObj[i] = initalObj[i];
}
return newObj;
}
let i = {a:[3],b:2};
let j = deepclone(i);
console.log(j);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值