ES6中Object.assign()与深拷贝浅拷贝

ES6中Object.assign()与深拷贝浅拷贝

源码点击

1. 浅拷贝

1.1 什么是浅拷贝?

  • 拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块同一块空间
  • 让几个对象共用一个内存

1.2 Object.assign()实现浅拷贝

参数

  • 参数一:目标对象,拷贝后返回的对象
  • 其他参数:源对象,需要拷贝到目标对象的对象
const target = {a:1}
const object1 = {b:2}
const object2 = {c:3}
console.log(Object.assign(target,object1,object2))
/* {a: 1, b: 2, c: 3} */
object1.b = 4
object2.c = 5
Object.assign(target,object1,object2)
console.log(target)
/* {a: 1, b: 4, c: 5} */
1.2.1 对于Object.assign()的其他说明
  1. 合并的时候相同的属性名会被替换
const target = {a:1}
const object = {a:'我要干掉你',b:2}
Object.assign(target,object)
console.log(target)
/* {a: "我要干掉你", b: 2} */
  1. 非对象会处理成对象之后,再做其他操作
    • 不能传递nullundefined,因为他们不能转换成基本包装类型
/* 基本类型的处理 */
const target = Object.assign(3)/* 转化成进本包装类型 */
console.log(target)/* Number {3} */
console.log(typeof 3 ,typeof target)/* number object */
  1. 对于数组,先转化为普通对象再处理
/* 对于数组的处理 */
console.log(Object.assign([2,3],[7]))/*  [7, 3] */
/* 
1.先转化成对象 {0:2,1:3} {0:7}
2. 同属性名进行替换
 */
1.2.1 变量引用的方式
let obj = {d:4}
let objCopy = obj
console.log(objCopy)

2. 深拷贝

2.1 什么是深拷贝?

  • 克隆出一个对象,数据相同
  • 但是引用地址不同

2.2 如何实现深拷贝?

2.2.1 使用JSON方法

JSON.parse(JSON.stringify(obj))

//JSON.parse(JSON.stringify(obj))
const target = {sun:"wukong"}
const copyObj = JSON.parse(JSON.stringify(target))
console.log(copyObj)/* {sun: "wukong"} */
target.sun = "xingzhe"
console.log(copyObj)/* {sun: "wukong"} */
2.2.2 使用 浅拷贝+ 递归 实现

使用递归的作用是解决,对象的属性仍旧是对象(嵌套的对象)

{a:{b:{c:{d:'d'}}}}

定义函数

/* 使用浅拷贝 + 递归 */
function copyDeep(obj) {
	//对于数据类型进行辨别
	//1.非对象返回本身
	if (!isObject(obj)) return obj
	//2.初始化数组或者对象
	var target = Array.isArray(obj) ? [] : {}
	//对于对象的处理
	for (let key in obj) {
		if (obj.hasOwnProperty(key)) {
			/* 如果属性是一个对象 */
			if (isObject(obj[key])) {
				target[key] = obj[key]
			} else {
				target[key] = obj[key]
			}
		}
	}
	return target
}

function isObject(obj) {
	/* 注意 null 这个特殊的类型 */
	return typeof obj === 'object' && obj !== null
}

使用

const target1 = {a:{b:{c:{d:'d'}}}}
const copyObj1 = copyDeep(target1)
console.log(copyObj1)//{a:{b:{c:{d:'d'}}}}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值