带布尔值的Object.assign

时间:2018-10-06 07:07:13

标签: javascript object ecmascript-6

有什么区别
Object.assign({},obj1,obj2);

Object.assign(true,obj1,obj2);

我知道obj.assign做什么,但是后者的用途是什么?它返回一个带有obj1和obj2的布尔类型以合并到其中。

PS:这是一个采访问题,所以想知道它的用例是什么。

2 个答案:

答案 0 :(得分:2)

如上所述,基元被“装箱”,因此如下:

 Object.assign(true, obj1, obj2)

只是与以下内容相同:

 const bool = Object.assign(new Boolean(true), obj1, obj2)

现在,布尔对象只是常规对象,当在它们上调用valueOf()时,它们返回布尔值。这意味着您会得到一些有趣的行为:

 bool === true // false
 bool == true // true
 +bool === 1 // true

您甚至不能在条件内使用该布尔对象,因为所有对象都是真实的:

  if(Object.assign(false,{a: 1 }))
   alert("works");

因此,实际上,常规对象与布尔对象之间没有区别,只是布尔对象增加了一些混乱,并且毫无用处。

答案 1 :(得分:1)

除了布尔值应该是原始类型外,它还具有对象类型包装器,这是令人惊讶的布尔值。

如果是

Object.assign(true,{a: 1}, {b: 2})

有这样的拳击(我真的很喜欢Java / C#世界的术语)发生了。然后Object.assign对该对象类型的包装程序进行适当的处​​理。这就是为什么结果在控制台中看起来像

  

布尔值{true,a:1,b:2}

与其他对象一样,

布尔对象也可以使用自定义键/值进行扩展。输出看起来令人困惑,但是如果在控制台中进行扩展,您将看到实际上没有“没有任何键的true值”-因此,这只是棘手的输出。

当您尝试对原始值(如

)调用某些方法时,字符串也会完全相同
'12345'.split(/./)

使用String()构造函数将其转换为对象,然后调用String的方法。

是的,我相信在现实生活中不应使用它。

这里是spec says

  
      
  1. 设为ToObject(目标)。
  2.   

因此,将原始对象明确转换为对象的第一步。