为什么1+ []在JavaScript中返回“ 1”?

时间:2019-08-13 11:13:23

标签: javascript

最近我的一个朋友问我一个问题:

![]+1+[]+false

经过评估后,我本能地回答了2。 但是,当我在浏览器控制台中尝试该表达式时,得到的输出是"1false"

对我来说,怪异的部分是1+[],其评估结果为"1"

我不明白为什么会这样,怎么运作?

有人可以解释吗?

谢谢

3 个答案:

答案 0 :(得分:9)

添加数字和对象,尝试将对象转换为基本体。为此,它在对象上调用.toString(),在这种情况下为空数组,并且对于调用.join()[].join()""的数组,因此为{{ 1}}与1 + []相同。

还请记住,添加项从左到右。

"1"

答案 1 :(得分:5)

由于JavaScript是弱类型语言,因此当您将运算符应用于不同类型的值时,值也可以在不同类型之间自动转换,这称为隐式类型强制。

通常,算法如下:

  1. 如果输入已经是原始类型,则不执行任何操作并返回它。
  2. 调用input.toString(),如果结果是原始的,则将其返回。
  3. 调用input.valueOf(),如果结果是原始的,则将其返回。
  4. 如果input.toString()和input.valueOf()都不产生基元,则抛出TypeError。
  

数值转换首先调用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”