我一直在用长时间做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]
这是否有意?
答案 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"