在JavaScript中,为什么+ [1.5]被认为是数字?

时间:2018-03-01 08:36:20

标签: javascript type-conversion loose-typing

我一直在用时间做JavaScript,但只是发现了我以前从未见过的东西。考虑:

let winner = await Promise.race([
... code removed for brevity
]);
// got the winner

为什么会这样?这是一个特殊的规则,将数组解释为数字还是规范炼金术的意外?

另请注意:

> +[1.5]
1.5

当然,这对我来说很有意义,但我希望> +[1,0] NaN 也是NaN,因为它不是一个数字。或者它被分类为数字?

然后有这些案例,让我相信我们正在通过类型强制虫洞(array ==> string,string ==> number):

+[1]

这是否有意?

2 个答案:

答案 0 :(得分:1)

一元+运算符在内部使用ToNumber抽象操作。

因此,一元运算符在应用它的对象时应用toString() (抽象操作ToPrimitive)然后应用 ToNumber抽象操作,所以基本上{{ 1}}当应用于单个数字的数组时,它将其转换为数字本身。

如果它应用于+,则toString将返回[4,5],当应用ToNumber抽象操作时返回NaN。

4,5

答案 1 :(得分:0)

在将一元+应用于数组之前,它会使用toString转换为字符串,然后尝试将其转换为数字。

所以

+[1.5]

充当

+([1.5].toString())

因此

+[1,0]

将[1,0](由两个元素组成的数组)转换为字符串1,5,然后尝试将其转换为数字

+[1,0] => +"1,0" => NaN
在这个例子中

+[2] + [4,5] => +"2" + "4,5" => 2 + "4,5" => "24,5"