js cast和type coercion - 为什么!! {} [true]不是真的?

san*_*hez 3 javascript console casting

在Chrome控制台中输入:

{}[true]  // [true] (object)
!!{}[true] // false (boolean)
Run Code Online (Sandbox Code Playgroud)

当{} [true]是什么时,为什么!! {} [true]不正确?

Art*_*lev 8

你是如何评价的{}[true]?实际上它是undefined因为空对象没有名为的属性'true'.很明显,事实undefined并非如此true.

UPD:我在谷歌Chrome开发者工具中检查了它...

{}[true] // [true]
!!{}[true] // false
console.log({}[true]) // undefined
Run Code Online (Sandbox Code Playgroud)

第一行是[true]因为涉及2个陈述.第一个是空块({}),第二个是带有一个元素的数组(true).相比之下,第二行评估为表达式(以及第三行中的参数),{}此处不再是块而是空对象.


Fel*_*ing 7

假设这些陈述是独立的:

{}[true] 被解释为

{} // empty block
[true] // array literal expression
Run Code Online (Sandbox Code Playgroud)

因此,如果在控制台中键入此内容,则会打印最后一个语句的结果,这是一个包含一个元素的数组,即布尔值true.

!!{}[true]另一方面,它被解释为访问'true'空对象的属性.这将返回undefined并在转换为false布尔值时转换为.