JavaScript - 为什么 +!{}[0] == 1?

4

我在网上发现了一个有趣的JavaScript问题。它是这样的: +!{}[0] 等于什么?

真正让我惊讶的是答案竟然是1

现在我正在努力理解为什么这个语法会导致这种结果。

所以我试图分解它:

!{} 返回 false

false[0] 返回 undefined

+false[0] 返回 NaN

因此,我不明白为什么上面的表达式会返回1。 有任何理论吗?


相关:为什么++[[]][+[]]+[+[]] =“10” https://dev59.com/uWw05IYBdhLWcg3wfx80 - Filburt
2
尽管我认为这种问题对于 Stack Overflow 并不是真正有价值的,但我很高兴你花时间自己解决了它。 - Felix Kling
2个回答

9
您的运算符优先级有误(MDN)。正确的顺序是: {}[0] 返回 undefined !undefined 返回 true +true 返回 1

@basilikum 当我在控制台(Chrome或FF)上检查{}[0]时,返回的是[0]而不是undefined。为什么?此外,![0]有什么意义? - Raj
@RJ,这一定是控制台的特殊行为。我不知道为什么在Chrome中会出现这种情况,但如果你写 var a = {}[0]; 然后只记录 a,它会显示正确的值(undefined)。所以我的猜测是,在这种情况下,Chrome将 {}[0] 视为两个独立的语句,并仅打印第二个语句的结果。如果你写 {}"hello",也会打印 hello。但无论如何,{}[0] 明确是 undefined - basilikum
@basilikum 谢谢!你是对的。按照你的方法,现在它显示为“未定义”。 - Raj

0

我认为你不能像你这样分解它,因为JavaScript有自己的规则,几乎像每个逻辑系统一样。 我认为首先被触发的将是{}。这创建了一个中性对象。在下一步中应该发生[0],所以它取出对象的第一个“元素”,然后可能会被处理为空数组。 这将被强制转换为False,并且您可以使用“!”来反转它。 由于+需要一个整数而true不是数字,因此它将被处理为零,在这种情况下通过“+”递增,因此最终结果为1。


我知道,它只是让我措手不及。 - Richard Hamilton
不是的。这只是尝试从对象中读取属性0,与数组无关。 - Felix Kling
当然,你是对的。无论如何,由于没有0属性,它将被转换为false(因为在js中未定义的布尔值被视为false)。 - xanobius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接