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

时间:2016-03-17 13:54:09

标签: javascript arrays node.js

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

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

我设法找到加里伯恩哈特的WAT讲话,提到了幽默主义方法中的相同行为 但遗憾的是没有解释。

同样的比较和同一性docs也无助于理解行为。

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

1 个答案:

答案 0 :(得分:2)

案例{}
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运算符将运算符转换为原始值,然后将结果转换为.xlsx

详细了解additionequality运营商。