javascript - 为什么 "[] + {} === {} + []"评估为 "true"?

标签 javascript

<分区>

如果您打开 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

关于javascript - 为什么 "[] + {} === {} + []"评估为 "true"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41124252/

相关文章:

不同语言环境和时区的 Javascript 日期对象

java - 使用 ANTLR 识别 JavaScript 文件中的全局变量声明

javascript - 英国电话号码的正则表达式 - 所有可能选项的变体

javascript - JS/ES6 : Do I need to re-export module after setting an attribute on it?

javascript - img 上的最小高度不变形

javascript - 解析动态 URL 的数据

javascript - 如何消除ajax调用的闪烁效果

javascript - 在 vscode 扩展中使用来自 vanilla javascript 的 Typescript 泛型

javascript - 无法在 nodeJS :TypeError: Cannot use 'in' operator to search for 'username' in fs 中对用户进行身份验证

javascript - 无法使用 Jquery 选择