翻转操作数时,添加带有空对象的空数组会产生不同的结果

Adding empty array with empty object yields different results when flipping operands

本文关键字:数组 结果 对象 操作数 添加 翻转      更新时间:2023-09-26

描述我的问题的最佳方式是举例说明:

# node v4.3.1
> {} + []
0
> [] + {}
'[object Object]'
> [] + {} === {} + []
true

我设法找到了加里·伯恩哈特(Gary Bernhardt)的WAT演讲,其中提到了幽默主义方法中的相同行为但可悲的是没有解释。

此外,相等比较和相同性文档也无助于理解行为。

在Firefox中发现了相同的行为,所以我想这应该是这样的,但是为什么呢?这是怎么回事,为什么翻转操作数会改变结果?更重要的是,为什么在我们看到它们的返回值不同时,测试两个表达式的严格相等总是产生 true?

案例 {} + []
JavaScript 认为{}是一个空的块语句,只是被忽略了。然后+ [] -> + '' -> + 0 -> 0 .
空块语句以这种方式转换为对象文字:({}),因此固定版本应为:({}) + []


案例[] + {}
[] + {} -> '' + '[object Object]' -> "[object Object]" .


案例[] + {} === {} + []
[] + {} === {} + [] -> '' + '[object Object]' === '[object Object]' + '' -> '[object Object]' === '[object Object]' -> true


通知:

  • 使用toString()方法将数组转换为基元值,这实际上是一个join(',')[]转换为具有 [].join(',') -> '' 的基元
  • 常规Object也使用 toString() 转换为基元值,默认情况下返回[object Object]
  • <value> + <value2>运算符尝试将其操作数转换为基元值。然后尝试连接转换的结果
  • + <value>运算符将运算符转换为基元值,则结果将转换为number

阅读有关加法和相等运算符的更多信息。