最近我的一个朋友问我一个问题:
![]+1+[]+false
经过评估后,我本能地回答了2
。
但是,当我在浏览器控制台中尝试该表达式时,得到的输出是"1false"
。
对我来说,怪异的部分是1+[]
,其评估结果为"1"
?
我不明白为什么会这样,怎么运作?
有人可以解释吗?
谢谢
答案 0 :(得分:9)
添加数字和对象,尝试将对象转换为基本体。为此,它在对象上调用.toString()
,在这种情况下为空数组,并且对于调用.join()
且[].join()
为""
的数组,因此为{{ 1}}与1 + []
相同。
还请记住,添加项从左到右。
"1"
答案 1 :(得分:5)
由于JavaScript是弱类型语言,因此当您将运算符应用于不同类型的值时,值也可以在不同类型之间自动转换,这称为隐式类型强制。
通常,算法如下:
数值转换首先调用valueOf(3),并回退到toString(2)。
字符串转换的作用与此相反:toString(2) 其次是valueOf(3)。
+
运算符触发数字转换。
因此valueOf将被用于空白数组,这仅是空白数组。 [].valueOf() // []
。
由于valueOf不是原始的,它将调用[].toString() //""
因此1 + []
将转换为1 + ""
。
由于操作数之一是字符串运算符,因此会触发1的字符串转换。
因此1 + ""
将转换为"1" + ""
因此您得到输出"1"
答案 2 :(得分:1)
如果至少一个操作数是字符串类型,则另一个操作数将转换为字符串并执行连接。
因此在这种情况下为1+ []-
[]。toString()给出空字符串,并且将对1进行字符串化,并获得输出“ 1”
进一步的false也将被字符串化,并且“ 1” + false =“ 1false”