ES6 Object.assgin()详解

34 篇文章 1 订阅

关于assgin()基本的这里就不讲解了,详细请参考阮一峰老师的ES6教程Object.assgin()文档

大致是合并对象所用,但是合并有一下几点需要注意

1.只有一个参数时返回原对象本身

具体请参考如下代码

let source = {a:1};     //原对象
let target = {};        //目标对象

target = Object.assgin(source);	//只有原对象

console.log(source);	//{a:1}
console.log(target);	//{a:1}

target.a = 2;

console.log(source);	//{a:1}
console.log(target);	//{a:1}


let source = {a:1}
let target = {};

target = Object.assgin({},source);	//有一个空对象

console.log(target);	//{a:1}
console.log(source);	//{a:1}

target.a = 2;			//此时只会改变目标对象

console.log(source);	//{a:1}
console.log(target);	//{a:2}

当只有一个参数时赋值给目标对象,目标对象更改原对象一样会更改

2.原对象只有一层是可作为深复制

言下之意原对象不只一层时不能做深复制,详情如下代码所示

let source = {
	a:1,
	b: [1,2,3]
}
let target = {};

target = Object.assgin({},source);	//有一个空对象

console.log(target);	//{a:1,b:[1,2,3]}
console.log(source);	//{a:1,b:[1,2,3]}

target.a = 2;			//此时只会改变目标对象
target.b[0] = 'str';	//此时目标对象与原对象均会变更

console.log(source);	//{a:1,b:['str',2,3]}
console.log(target);	//{a:2,b:['str',2,3]}

当原对象内还有对象值时,该对象值会随着目标对象值的变更而变更

因为他们任然是同一引用,但是最外层的对象之变化原对象不会随之变化

因此说是可以作为一层深复制

3.目标对象内对象变为非对象原对象不会变更

解释比较拗口,请看代码

let source = {
	a:1,
	b: [1,2,3]
}
let target = {};

target = Object.assgin({},source);	//有一个空对象

console.log(target);	//{a:1,b:[1,2,3]}
console.log(source);	//{a:1,b:[1,2,3]}

target.a = 2;					//此时只会改变目标对象
target.b = target.b.join(',');	//此时只会改变目标对象的值

console.log(source);	//{a:1,b:[1,2,3]}
console.log(target);	//{a:2,b:'1,2,3'}

与2不同的是把target.b变为字符串,此时source.b并不会改变

因为两者并不是同一引用,2中source.b会改变是因为两者的数组是同一引用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值