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