在 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
。