为什么Javascript中的parseInt不能正确地测试数组?

4

给定:

var obj={0:21,1:22}

并且

var arr=[21,22]

为什么parseInt(obj)返回NaN,但parseInt(arr)返回21
我有一个函数,我将传递一个int、一个哈希类型的object或一个普通的array。我期望parseInt对于objectarray都返回NaN,从而简化参数检查。怎么回事?

1
你为什么要使用 parseInt()?我只会在两种情况下使用它,一是用于非十进制输入,二是解析已知格式的输入字符串,比如 CSS 中的 "10px",我只需要获取其中的 10 部分。我认为 Number([21,22]) 和一元加操作符 +[21,23] 都会返回 NaN - nnnnnn
@nnnnnn - 为什么不呢?if isNaN(parseInt(argument1))...。 简单易懂,方便快捷。有什么问题吗?我并非轻率发言,我只是真的好奇。 - dgo
如果argument1是字符串“123abc”,那不是一个有效的数字,但是parseInt(“123abc”)返回123。如果这是您实际想要的结果,那么可以使用parseInt(),但在我的经验中,这种情况相当罕见(我已经给出了一个例子,在那种情况下确实有意义)。如果您想测试函数参数是否已经是一个数字(而不是对象或数组),则可以使用typeof运算符。 - nnnnnn
@nnnnnn - 我明白你的意思。 - dgo
1个回答

8
这是因为在解析为整数之前,parseInt 尝试强制将第一个参数转换为字符串。 String(obj) 返回 "[object Object]",不能被解析,但是String([21,23]) 返回 "21,23"parseInt 解析到无法解析的字符之前可以解析该部分。
请参见parseInt规范:the parseInt spec

inputString变为 ? ToString(string)。

(将输入强制转换为字符串)。

如果 S 包含不是基数 R 数字的代码单元,则 Z 为 S 中第一个这样的代码单元之前的所有代码单元组成的子字符串;否则,Z 为S。

(丢弃以非数字字符开头的任何字符串部分,因此"21,23" -> "21")。

这是正确的。数组的字符串表示是将数组元素连接起来的结果。 - Ram
这是因为parseInt试图将参数强制转换为字符串。但文档的含义与此相反:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/parseInt - Mamun
@AlMamun 你为什么认为文档说的不一样呢?非字符串参数被转换为字符串,是吗? - nrabinowitz
第一个参数被强制转换为字符串,然后解析为数字。问题是关于非字符串输入会发生什么。 - nrabinowitz
请提供原始的英文内容,以便我可以为您进行准确的翻译。 - nrabinowitz
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接