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

标签 javascript type-conversion loose-typing

<分区>

很长时间 一直在使用 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)

这是故意的吗?

最佳答案

一元 + 运算符在内部使用 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]

关于javascript - 在 JavaScript 中,为什么 +[1.5] 被认为是数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49045615/

相关文章:

javascript - 动态列表隐藏空元素

javascript - 在 Knockout 中为变量设置值的最短方法

javascript - 小数值显示为分数,空格太多

python - 将字符串(字母)从文件文本转换为整数

运行时类型解析的 Java 最佳实践

javascript - 松散打字的优点是什么?

javascript - 如何遍历具有数组的对象并对值求和?

c++ - Open Babel C++ API 为什么他们的自定义迭代器不能直接用作函数的参数?

c++ - 为什么没有隐式类型转换的警告?

objective-c - 重写方法时的严格类型与宽松类型