在Chrome控制台中输入内容:
{}[true] // [true] (object)
!!{}[true] // false (boolean)
当{} [true]是?
时,为什么!! {} [true]不正确答案 0 :(得分:8)
您是如何评价{}[true]
的?实际上它是undefined
,因为空对象没有名为'true'
的属性。很明显undefined
不是true
。
UPD :我在Google Chrome开发者工具中检查了它...
{}[true] // [true]
!!{}[true] // false
console.log({}[true]) // undefined
第一行是[true]
,因为涉及2个语句。第一个是空块({}
),第二个是带有一个元素的数组(true)。相反,第二行将表达式(以及第三行中的参数)计算为{}
,其中{{1}}不再是块而是空对象。
答案 1 :(得分:7)
假设这些陈述独立存在:
{}[true]
被解释为
{} // empty block
[true] // array literal expression
因此,如果您在控制台中键入此内容,则会打印最后一个语句的结果,这是一个包含一个元素的数组,布尔值为true
。
!!{}[true]
被解释为访问空对象的属性'true'
。这将返回undefined
并在转换为布尔值时转换为false
。
答案 2 :(得分:4)
这取决于上下文。当JavaScript解析器在开始时看到{}
它认为它是一块代码而不是对象时,因此有效{}[true]
与[true]
相同,实际上,在控制台中:
> {}[true]
[true]
但
> x = {}[true];
undefined
因为{}
不在开头或
> ({}[true])
undefined
因为()
迫使JS将其视为表达式。
如果JavaScript解析器在{}
前面看到某些内容,它会将{}
解释为对象,因此在控制台中:
> !!{}[true]
true
答案 3 :(得分:3)
{}[true] => true (object)
不是一个布尔对象。如果有的话,它返回一个带有一个项的数组 - 布尔值为true。当{}
被解释为(空)块(请参阅Why {} != ( {} ) in JavaScript?),而第二个语句[true]
是数组文字时,会发生这种情况。如果你试过
({}[true])
// or
({})[true]
(或以其他方式强制将其作为表达式求值)您访问"true"
空对象的undefined
属性。这也发生在你的第二个案例中:
!!{}[true] => false (boolean)
,!!
强制将{}
强制解释为对象文字。 !undefined
为true
,因此!!undefined
将产生false
。