添加空对象的空数组在翻转操作数时会产生不同的结果
描述我的问题的最好方法是通过示例来说明:
# 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
阅读更多关于加法和平等运算符。