2

我一直在做 JavaScript 很长一段时间,但只是注意到一些我以前从未见过的东西。考虑:

> +[1.5]
1.5

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

另请注意:

> +[1,0]
NaN

当然,这对我来说是有道理的,但我原以为这+[1]也是 NaN,因为它不是一个数字。还是以某种方式归类为数字?

然后是这些情况,这让我相信我们正在穿越一个类型强制虫洞(数组 ==> 字符串,字符串 ==> 数字):

> [2] + [4]
"24"
> + [2] + [4]
"24"
> (+[2]) + (+[4])
6
> +[2] + [4,5]
"24,5"
> // which, incidentally, looks like a european-formatted number, but I see
> // that that's just an accident (still another possibility for confusion)

这是故意的吗?

4

2 回答 2

1

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

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

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

// Trying to concatenate two string as [] coerce to strings = 24
[2] + [4]
// Converting 2 and 4 to number and then adding = 6   
(+[2]) + (+[4])
// Converting 2 to number and 4,5 will be coerced to string = 24,5
+[2] + [4,5]
于 2018-03-01T08:43:28.863 回答
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"
于 2018-03-01T08:46:32.060 回答