描述我的问题的最佳方式是举例说明:
# node v4.3.1
> {} + []
0
> [] + {}
'[object Object]'
> [] + {} === {} + []
true
我设法找到加里伯恩哈特的WAT讲话,提到了幽默主义方法中的相同行为 但遗憾的是没有解释。
同样的比较和同一性docs也无助于理解行为。
在Firefox中发现相同的行为,所以我想这应该是这样,但为什么呢?这里发生了什么,为什么翻转操作数会改变结果呢? 更重要的是,为什么测试strict equality的两个表达式总是得到真,而我们看到它们的返回值不同?
答案 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