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

描述我的问题的最好方法是通过示例来说明:

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

我已经设法find加里·伯恩哈特的一个WAT讲话,用幽默的方式提到了同样的行为,但可悲的是没有解释。

同样的比较和相同的文件也没有帮助理解行为。

在Firefox中发现相同的行为,所以我想这应该是这样,但为什么? 这里发生了什么,为什么翻转操作数会改变结果呢? 更重要的是为什么在我们看到他们的回报价值是不同的时候,为了严格的平等而对这两个expression式进行testing总是会成真的

案例{} + []
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

阅读更多关于加法和平等运算符。