3

在 Chrome 控制台中输入:

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

当 {}[true] 为真时,为什么 !!{}[true] 不为真?

4

4 回答 4

8

你是如何评价的{}[true]?实际上是undefined因为空对象没有名为的属性'true'。很明显undefined不是true

UPD:我已经在 Google Chrome 开发者工具中检查过它并且...

{}[true] // [true]
!!{}[true] // false
console.log({}[true]) // undefined

第一行是[true]因为涉及到 2 个语句。第一个是空块 ( {}),第二个是具有一个元素的数组 (true)。相反,第二行计算为表达式(以及第三行中的参数),{}这里不再是一个块,而是一个空对象。

于 2013-04-10T11:55:46.807 回答
7

假设这些陈述是独立的:

{}[true]被解释为

{} // empty block
[true] // array literal expression

因此,如果您在控制台中键入它,则会打印最后一条语句的结果,它是一个包含一个元素的数组,即 boolean value true

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

于 2013-04-10T11:58:25.270 回答
4

这取决于上下文。当 JavaScript 解析器{}一开始看到它时,它认为它是一个代码块,而不是对象,因此实际上与控制台中的实际上{}[true]是相同的:[true]

> {}[true]
[true]

> x = {}[true];
undefined

因为{}不是在开始或

> ({}[true])
undefined

因为()强制 JS 将其视为表达式。

如果 JavaScript 解析器看到它前面的{}东西被解释{}为对象,那么在控制台中:

> !!{}[true]
true
于 2013-04-10T11:58:47.013 回答
3
{}[true]  =>   true  (object) 

不是真正的布尔对象。如果有的话,它会返回一个包含一项的数组 - 布尔值 true。当{}被解释为(空)块时会发生这种情况(请参阅为什么 {} != ( {} ) in JavaScript?),并且第二个语句[true]是数组文字。如果你试过

({}[true])
// or
({})[true]

(或以其他方式强制它被评估为表达式)您访问"true"一个空对象的属性,即undefined. 这也发生在您的第二种情况下:

!!{}[true]  =>   false  (boolean)

因为!!强制{}被解释为对象字面量。并且!undefinedtrue,所以!!undefined会屈服false

于 2013-04-10T11:59:45.643 回答