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

Javascript ES6 Object.assign():为什么未定义的属性会覆盖已定义的属性?,javascript,ecmascript-6,Javascript,Ecmascript 6,为什么下面的代码段返回{a:3,b:undefined}而不是{a:3,b:2} console.log(Object.assign({a:1,b:2},{a:3,b:undefined})){a:3}有一个属性,其键是字符串“a”。您可以通过Object.keys({a:3})观察这一点,它返回[“a”] {a:3,b:undefined}有两个属性,一个称为a,另一个称为b。调用Object.keys({a:3,b:undefined})返回[“a”,“b”] Object.assign使

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


console.log(Object.assign({a:1,b:2},{a:3,b:undefined}))
{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
的规范没有专门处理属性值
未定义的情况

{a:3}
根本没有名为“b”的属性,而
{a:3,b:undefined}
有。在第二种情况下,你有一个值。它是一个属性的存在,决定它是否被复制,而不是值。稍微相关:。
未定义的
是一个值,不应该被忽略。至于它为什么这样设计,我认为这可能太宽泛了,因为它要求设计背后的意图。很好的解释用一个代码片段演示结果的estion。有点道理,
Object.keys({a:1})
返回
[“a”]
,而
Object.keys({a:1,b:undefined})
返回
[“a”,“b”]
,但它也有点不存在。我认为JavaScript与
null
分开维护
undefined
,特别是因为
null
传达“此属性存在且没有值”,而
undefined
传达“此属性不存在”。因此为什么
{a:1}.completelyMadeUpPropertyName
返回
未定义的
@Dominus
未定义的
表示缺少值(但不一定缺少属性,正如我们可能定义了值为
未定义的
的变量一样,我们也可能有保存
未定义的
的属性)然而,根据ES5规范,
null
表示“故意不存在任何对象值”;也就是说,
null
特别表示对象上下文/值,但是santics表示没有实际值。
null
总体而言,是语言的一个非常愚蠢的特性。啊,这是有意义的。因此
{a:1}
说“我没有名为‘b’的属性,
{a:1,b:undefined}
说“我有一个属性‘b’,但它还没有被赋予值,
{a:1,b:null}
说“我有一个属性‘b’,它故意没有被赋予值“.听起来对吗?@Dominus.Vobiscum严格按照规范,
null
的意思是“这应该包含一个对象,而当前值不是对象”,但除此之外,这是一个非常好的总结。啊,好的。谢谢你回答了一个有点深奥的问题!