关于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会改变是因为两者的数组是同一引用