如果您打开 JS 控制台并输入 [] + {} === {} + []
,它会告诉您这是真的。
我不明白为什么会这样。我试图查看它是如何解析的。
对于 [] + {}
,这里的 +
是加法运算符,因为操作数都是文字。 LHS 不会通过 .valueOf()
产生数字,因此它使用 .toString()
在两个操作数上执行字符串连接,给我们 ""
+ [对象对象]”
对于 {} + []
而言,{}
是一个空代码块并且被“忽略”,此处的 +
运算符被解析作为一元加运算符,它将其操作数转换为数字。转换为数字的空数组变为 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 不应该是真的。
第二点in this magnificent answer解释将数组和对象“加在一起”时会发生什么。
var result = [] + {};
console.log(result);
console.log(typeof result);
您得到的是 string [object Object]
因为每个参数都被转换为字符串。对于一个数组,这会导致对其调用 .join()
,这反过来会导致一个空字符串。对于对象,它生成字符串 "[object Object]"
- 将它们相加得到第二个字符串。
同样的情况发生在比较的两边——在右边,顺序不同,但这并不重要。结果将不与答案中的第 3 点相同,不同之处在于 {} + []
位于该行的开头,因此 {}
被解释为空 block 。在这种情况下,它将(正确地)解释为一个普通的对象表示法)。将执行相同的转换逻辑,并将生成与之前相同的字符串:"[object Object]"
所以,最后,您正在比较返回 true
的 [object Object]"=== "[object Object]"
。
请注意,{} + [] === [] + {}
不会产生相同的结果 - 同样,由于链接答案的第 3 点 -第一个 {}
将被解释为一个空 block ,因此左侧变为 +[]
将数组转换为数字,因此比较的结果将是错误
。 但是 如果您在 Chrome 开发工具中测试此表达式,您确实会得到 true
。这是因为 Chrome will auto-wrap your expression in parentheses这会强制将初始 {}
解释为一个对象。在 Firefox 或 Node REPL 或其他软件中检查 {} + [] === [] + {}
应该会产生“正确”的 false
。