Object.assign的用法与注意事项【面试须知】

在这里插入图片描述

脑图源于:https://juejin.cn/post/6844904191031246861#heading-4

详细解释与示例

Object.assign(target,...sources)
用于将源对象(source)可枚举的属性复制到目标对象,并返回目标对象。如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。

const test1={a:1,b:2};
const test2={b:3,c:4};
const test3={c:5,d:6};
const test4=Object.assign(test1,test2,test3)
console.log(test1); // {a: 1, b: 3, c: 5, d: 6}
console.log(test2); // {b: 3, c: 4}
console.log(test3); // {c: 5, d: 6} 
console.log(test4); // {a: 1, b: 3, c: 5, d: 6}
test4.d=100;
console.log(test1); // {a: 1, b: 3, c: 5, d: 100}
console.log(test2); // {b: 3, c: 4}
console.log(test3); // {c: 5, d: 6} 
console.log(test4); // {a: 1, b: 3, c: 5, d: 100}

只复制源对象的自身属性(不复制继承属性),也不复制描述符。

let obj=Object.create({a:1},{
    b:{value:2},
    c:{value:3,enumerable:true,writable:true},
  }
)
console.log(obj); // {b:2,c:3}  
// 输出的是对象自身属性,{a:1}在原型里

const newObj=Object.assign({},obj);
console.log(newObj); // {c:3}
// 没有a,因为assign只复制自身属性
// 没有b,因为assign只管可枚举的属性

delete obj.c; // 删除obj中的c
console.log(obj); // {b:2,c:3} 
// 删不掉c,因为c没设置configurable:true

delete newObj.c; // 删除newObj中的c
console.log(newObj); // {} 
// 删掉了c,因为源对象将可枚举属性分配过去时,描述符不会一起分配过去

属性名为Symbol值的属性也会被Object.assign复制

let symbol=new Symbol('abc');
let obj={name:'name',symbol};
console.log(obj);// {name: "name", symbol: Symbol(abc)}
let newObj=Object.assign({},obj);
console.log(newObj);// {name: "name", symbol: Symbol(abc)}

如果只有一个参数,Object.assign会直接返回该参数,如果该参数不是对象,则会先转成对象,然后再返回。由于undefined和null不发转成对象,将他们作为参数会报错。

在这里插入图片描述

如果非对象参数出现在源对象位置(即非首参数),这些参数都会转成对象,如果无法转成对象便跳过,所以undefined和null不会报错。

const v1=123;
const v2='456';
const v3=true;
const arr=['a','b'];
const obj={name:'name'};

const res1=Object.assign({},v1,v2,v3);
// {0: "4", 1: "5", 2: "6"} 
const res2=Object.assign({},v1,v2,v3,arr,obj);
// {0:'a',1:'b',2:'6',name:'name'}
// 因为可枚举的属性可以被复制到目标对象,

除了字符串能以数组形式复制到目标对象,其他值都不会产生效果,因为只有字符串的包装对象会产生可枚举属性

在这里插入图片描述

注:本人是看了一个有关Object.assign的视频,于是总结了这篇文章。https://www.bilibili.com/video/BV1zt4y1Y7F5?from=search&seid=9652067596171210561

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值