一个有趣的js隐式转换的问题
在chrome的控制台中打印一下表达式
[] + {} //结果为 [object object]
然后调整顺序打印
{} + [] //结果为 0
然后将两个表达式组合一下
{} + [] === [] + {} //true
wtf???
原理解释如下:
一般的类型转换的时候, 面对 + , 首先调用 valueOf[1]进行转换, 如果转换的结果不是
基本类型, 那么采用 toString() 方法进行转换, 所以
[]+{} //结果Wie [object + object]
但是 {} 在js或者很多语言中是代码块的区别标志, 所以在首位的话, 会被认为是 blank block 而
忽略, 所以 +[], 即 +"", 最终的结果会是 0
{}+[]// 0
而最终的
{}+[] === [] + {}//true 是因为 chrome 默认在这种判断的外边增加了 括号, 所以两个字符
//"[object object]" === "[object object]" 自然就是 true 了.
[1] Date除外
1 ↩︎