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

时间:2013-04-10 11:54:00

标签: javascript casting console

在Chrome控制台中输入内容:

{}[true]  // [true] (object)
!!{}[true] // false (boolean)

当{} [true]是?

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

4 个答案:

答案 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)

!!强制将{}强制解释为对象文字。 !undefinedtrue,因此!!undefined将产生false