ES6 Object.assign():为什么未定义的属性会覆盖已定义的属性?

时间:2019-02-26 19:55:37

标签: javascript ecmascript-6

为什么以下代码段返回{ a: 3, b: undefined }而不返回{ a: 3, b: 2 }

console.log(Object.assign({ a: 1, b: 2 }, { a: 3, b: undefined }));

This question询问一个给出后者输出而不是前者输出的函数,但是我的问题是为什么Object.assign()是用这种方式设计的?或者换一种说法,{ a: 3 }{ a: 3, b: undefined }之间到底有什么区别?

更新(摘自对ps弹手答案的评论):

{ a: 1 }说“我没有名为'b'的属性”,{ a: 1, b: undefined }说“我有一个属性'b'但尚未赋值”,并且{{1} }说:“我有一个属性'b',该属性应容纳一个对象,但尚未被赋予要容纳的对象”。由于在后两个对象中,该对象都具有属性“ b”,无论其值是多少,当传递到{ a: 1, b: null }时,它仍将覆盖非null非未定义的值。

1 个答案:

答案 0 :(得分:1)

{ a: 3 }具有一个属性,其键为字符串“ a”。您可以通过Object.keys({a:3})观察它,它返回["a"]

{ a: 3, b: undefined }具有两个属性,一个称为a,另一个称为b。调用Object.keys({a: 3, b: undefined})会返回["a", "b"]

Object.assign使用每个传入对象上存在的任何(可枚举的)属性中的值,并且assign的规范不专门处理属性恰好具有值undefined的情况