【js】浅拷贝与深拷贝

一、理解

1、浅拷贝:只是拷贝一层,更深层次对象级别的只拷贝了地址

        浅拷贝的时候如果数据是基本数据类型,那么就如同直接赋值那种,会拷贝其本身,如果除了基本数据类型之外还有一层对象,那么对于浅拷贝而言就只能拷贝其引用,对象的改变会反应到拷贝对象上

2、深拷贝:深拷贝就会拷贝多层,即使是嵌套了对象,也会都拷贝出来,内容和原对象一样,更改原对象,拷贝对象不会发生变化

二、浅拷贝

1.用Js实现浅拷贝

var obj = {
	id:1,
	name:'Andy',
	msg: {
		age:18
	}
}

var newObj = {}
for(var key in obj) {
	//key是当前属性名, obj[k]是当前属性值
	newObj[key] = obj[key]
}

console.log(newObj)

在这里插入图片描述

从打印结果我们可以看出已经成功将obj的属性已经值拷贝进了newObj,但是我们应该意识到:obj.msg.age与newObj.msg.age他们引用的是同一个地址的数据,换句话说,newObj.msg只拷贝了obj.msg的地址 。

在这里插入图片描述

2. 浅拷贝语法糖

ES6新增方法 assign可以快速实现浅拷贝

2.1 写法

Object.assign(target,  ...sources)

  • target:要拷贝给谁
  • source:要拷贝的对象

2.2 应用

var obj = {
	id:1,
	name:'Andy',
	msg: {
		age:18
	}
}

var newObj = {}
Object.assign(newObj,obj)  //把obj浅拷贝给newObj

 总结:浅拷贝如果遇到更深层次的数据(如:对象、数组这类引用类型数据),只是拷贝了地址。

三、深拷贝

1.用Js实现深拷贝

var obj = {
	id:1,
	name:'Andy',
	msg: {
		age:18
	},
	color:['pink','red']
}

var newObj = {}
//封装函数
function deepCopy(newObj,obj) {
	for(var key in obj) {
		//判断属性值属于哪种数据类型
		//属性值 obj[key]
		//1.判断这个值是否为数组(数组也属于特殊对象,也是引用类型数据)
		if(obj[key] instanceof Array) {
			newObj[key] = []
			deepCopy(newObj[key],obj[key]) //运用递归,把原对象属性值给新对象
			//判断这个值是否为对象
		} else if(obj[key] instanceof Object) {
			newObj[key] = {}
			deepCopy(newObj[key],obj[key]) //运用递归,把原对象属性值给新对象
		} else {
			//若是普通数据类型
			newObj[key] = obj[key]
		}
		
	}
}
deepCopy(newObj,obj)

遍历原对象,检查每个属性值都属于什么数据类型:若是简单数据类型,直接赋值;若是复杂数据类型的(数组、对象),我们先来判断属于哪种复杂数据类型,接着我们进入里面利用递归的方式,把里面的值取出来再进行赋值操作。

在这里插入图片描述

 值得一提的是:判断条件是否为数组、是否为对象这两个不能颠倒,因为若先判断是否为对象,那么数组也会进入该判断,因为数组为“特殊对象”。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值