深克隆与浅克隆

本文深入探讨了深克隆和浅克隆的概念,解释了两者之间的主要区别,并提供了JavaScript实现的示例代码。通过对比,读者可以理解深克隆如何完全复制对象的所有属性,而浅克隆仅复制对象的第一层属性。

说明

深克隆:所有元素或属性均完全复制,与原对象完全脱离,也就是所有对于新对象的修改都不会反应到原对象中。修改克隆后的数据不会影响源数据。

浅克隆:直接将存储在栈中的值赋值给对应变量,如果是基本数据类型,则直接赋值对应的值,如果是引用类型,则赋值的是地址。修改克隆后的数据源数据也会被修改。

实现

深克隆实现

//深克隆
function clone(obj){
	let buf;
	if(obj instanceof Array){
		buf = [];
		let i = buf.length;
		while(i--){
			buf[i] = clone(obj[i]);
		}
		return buf;
	}else if(obj instanceof Object){
		buf = {};
		for(let k in obj){
			buf[k] = clone(obj[k]);
		}
		return buf;
	}else{
		return obj;
	}
}

浅克隆实现

  • 只复制第一层
//浅克隆  
function clone(obj){
	let buf;
	if(obj instanceof Array){
		buf = [];
		let i = buf.length;
		while(i--){
			buf[i] = obj[i];
		}
		return buf;
	}else if(obj instanceof Object){
		buf = {};
		for(let k in obj){
			buf[k] = obj[k];
		}
		return buf;
	}else{
		return obj;
	}
}

  • Object.assign方法
//es6 的Object.assign属于浅克隆
var obj = {
    a: 1,
    b: 2
}
var obj1 = Object.assign(obj);
obj1.a = 3;
console.log(obj.a) // 3
  • 直接用=赋值
let a=[0,1,2,3,4],
    b=a;
console.log(a===b);//true
a[0]=1;
console.log(a,b);//[1,1,2,3,4][1,1,2,3,4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值