有什么区别
Object.assign({},obj1,obj2);
和
Object.assign(true,obj1,obj2);
我知道obj.assign做什么,但是后者的用途是什么?它返回一个带有obj1和obj2的布尔类型以合并到其中。
PS:这是一个采访问题,所以想知道它的用例是什么。
答案 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:
- 设为ToObject(目标)。
因此,将原始对象明确转换为对象的第一步。