JS 中总是会出现一些看似不可理喻的现象,比方说
[] + {} === 0
结果为 false
,而 {} + [] === 0
的结果却为 true
只是换了一下 []
和 {}
的位置呀,怎么会给出截然不同的结果呢?
-
{} + [] === 0
结果为true
JS 是一个脚本语言,这意味着当引擎面临 {} + [] === 0
时,它首先看到的是 {}
,此时, {}
既可以被解释成一个对象,也可以被解释成一个(空的)代码块。
在这里,如果 {}
被解释成一个对象的话,对象和数组相加会将两者都转换成字符串,而字符串显然与 0
类型不等。
因此,在 {} + [] === 0
中, {}
一定是被解释成了代码块,也就是说 {}
实际上并不是所谓的表达式的一部分,而 {} + [] === 0
也能被等价地转换为 + [] === 0
,此时, []
被转换为字符串 ''
,而一元加号又会将字符串 ''
转换为数字 0
,很显然 0===0
结果为 true
-
[] + {} === 0
结果为false
在这里, {}
无法被解释成代码块,所以 {}
就是一个对象,而如之前所说,数组与对象相加的结果是一个字符串,字符串和 0
之间很显然类型不等,因此 [] + {} === 0
的结果就是 false
- 类推
({} + [] === 0)
结果为 false
,原因: {}
被解释为对象