【发布时间】:2017-04-28 16:48:13
【问题描述】:
如果你打开你的 JS 控制台并输入 [] + {} === {} + [] 它告诉你这是真的。
我不明白这是为什么。我试图查看它是如何解析的。
对于[] + {} + 这里是加法运算符,因为操作数都是文字。 LHS 不会通过.valueOf() 产生数字,因此它在两个操作数上使用.toString() 执行字符串连接,从而得到"" + "[object Object]"
对于{} + [],{} 是一个空代码块并被“忽略”,这里的+ 运算符被解析为一元加运算符,它将其操作数转换为数字。转换为数字的空数组变为0
所以这似乎是"[object Object]" === 0,这肯定应该是假的?
身份运算符检查两个操作数是否相等而不进行类型转换。我看不出这怎么可能是真的。我错过了故事的哪一部分?
编辑:
我知道如果你输入 ({} + []) 它会将其解析为一个空对象,从而使 RHS 等于“[object Object]”。我查了一下,( ) 是分组运算符。那么也许这与此有关?
这不是What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wat' talk for CodeMash 2012? 的副本。回答要点 1 === 2 不应该是真的。
【问题讨论】:
-
{}不可能被解释为一个空块,因为它紧跟在===之后(并且[] + {} ===本身不是一个有效的语句)。 -
不是真正的WTF,只是对解释器的误解! :)
-
([] + {}) === ({} + [])也是如此 -
这是“不重复”的第 2 点。它准确地解释了发生了什么
[] + {}评估为"[object Object]"- 字符串,然后{} + []做了完全相同的事情。它看起来像另一个问题中的第 3 点这一事实是无关紧要的,因为那里的驱动力是{}是线上的 first 事物 - 这使它成为一个空块。在这种情况下,它完全等同于{} + [],因为它产生"[object Object]"。
标签: javascript