群里的KB提出了一个很有趣的问题。

说出{}+[]和[]+{}的结果是什么,并为什么。

其实关于+运算符是怎么工作的,已经引发了挺多次的讨论。

无怪乎: a+b的话

如果a和b都是数值,那么就把他们的数值相加,比如1+2=3

如果a和b都是字符串,那么,就把他们连接起来,比如”1″+”2″=”12″

如果一个是数值一个是字符串,则把其中一个转化为字符串,然后连接 比如1+”2″=”12″

如果以上情况都不属于,比如问题总的[]+{},那么就对双方都执行ToPrimitive操作,并把结果按照数值方式或字符串方式+操作

那么,[]+{}的结果就很容易理解了,[]的ToPrimitive获取默认值,实际是toString,变为空字符串”",{}的toString,是”[object Object]”

他们的结果合并,就是”[object Object]”

按照这个理解,那么{}+[]的结果其实应该和[]+{}的结果是一样的,但是为什么{}+[]的结果是0呢?

其实在javasript解释代码文本的时候,字符{}有两种解释方式,一种是我们常认为的对象,例如{a:1},另一种是代码块例如  function a(){}

但是如果{字符出现在一段的开头,那么,肯定被当作代码块执行的。

所以{}+[]的{}被当作代码块处理,没有了结果,最后就是+[]了,空数组被转化为数值,就是0了

真是一个有趣的问题!