parseInt()应该像这样工作吗?

14
如果我写了这段脚本: alert(parseInt("123blahblahblah456")); 那么会弹出一个警示框,显示的值是123。
理想情况下,由于这是一个无效的整数字符串,函数不应该执行任何操作吧? parseFloat()同样也是如此。

3
方便的Google搜索技巧:在JavaScript函数名后面输入"mdn",例如"parseint mdn",第一个搜索结果几乎总是Mozilla开发者网络上的适当文档页。 - nnnnnn
1
当你解析CSS属性时,这种行为非常方便,因为有时它们包含单位: parseInt("120px",10) -> 120 - Ignitor
7个回答

20

是的,所有的回答都正确。我想补充一点,这就是为什么在检查某个值是否可以转换为数字时,最好使用 Number 或者只使用 +

Number("123blahblahblah456"); //=> NaN
Number("123"); //=> 123
+"97.221" //=> 97.221
// if the conversion result needs to be an int
Math.round(Number("123.4567")); //=> 123

需要注意的是,Number 在某些情况下(出乎意料地)返回 0

+null   //=> 0
+"  "   //=> 0
+""     //=> 0
+false  //=> 0
+[]     //=> 0

16

是的:parseInt() 的确是被设计成这样工作的;引用 Mozilla 开发者网络的解释:

parseInt 函数将它的第一个参数转换为一个字符串,然后解析这个字符串并且返回一个整数或 NaN。如果不是 NaN,则返回值将会是第一个参数在特定基数(即进制)下的十进制整数表示。例如,基数为 10 表示要从十进制数字转换,8 表示八进制,16 表示十六进制等等。对于大于 10 的基数,字母表示比 9 大的数字。例如,在十六进制数字(基数为 16)中,使用 A 到 F。

如果 parseInt 遇到了在指定基数下不是数字的字符,则会忽略该字符和所有后续字符,并返回解析到该点的整数值。parseInt 将数字截断为整数值。前导和尾随空格是被允许的。

看起来 parseInt() 明确地期望将一个字符串作为输入,并将第一个数字序列(直到遇到无效的数字字符)作为以 radix 参数指定的进制的数字返回。

顺便提一下,为了减少解析传递给 parseInt() 的字符串时出现错误,请记得使用 radix 参数,例如:

parseInt('123odod24',10); // for base-10
parseInt('123odod24',16); // for base-16

参考资料:


4
这很愚蠢,我明白它可能有一些有用的应用,但如果它能够检查整个字符串并在遇到任何NaN时返回false,那将会更加有用。只是为了明确,我是在说Brendan Eich做出了一个愚蠢的决定,而不是在指责你 :) - Pixelomo

13

parseInt 试图解析字符串,直到找到非整数值为止,然后返回它所解析的部分。

因此,如果字符串为:

  • 1234abcd - 它返回 1234
  • 1a3f - 它返回 1
  • a14883 - 它返回 NaN
  • 1.5 - 它返回 1
  • -1.3a - 它返回 -1

parseFloat 也是这样,只不过它不会在遇到小数点时停止解析。

  • 1234abcd - 它返回 1234
  • 1a3f - 它返回 1
  • a14883 - 它返回 NaN
  • 1.5 - 它返回 1.5
  • -1.3a - 它返回 -1.3

6
这是它的工作方式。它会解析字符串,直到遇到一个非数字字符。
你可能会对检查函数isFinite()感兴趣,它可以检查一个字符串是否为有限的、合法的数字:
isFinite("123"); // true
isFinite("123a");// false

然而,这会针对空字符串和空格返回 true。因此,您可以通过编写以下内容来改进此解决方案

mystring = "123";
mystringb = " ";
!isNaN(parseInt(mystring)) && isFinite(mystring); // true
!isNaN(parseInt(mystringb)) && isFinite(mystringb); // false

根据这些建议,我相信您可以构建自己的函数,忽略任何包含非数字字符的字符串。


请注意,IE11不支持isFinite函数。 - Michael Heuberger

2

2

根据官方文档parseInt函数的行为如下:

如果在指定进制下解析时遇到一个非数字的字符,parseInt会忽略它及其后面的所有字符,并返回已经解析出来的整数部分。

无论这种行为是否明智,现在都已经太晚改变了。


-2

是的!就像这里解释的一样:http://www.w3schools.com/jsref/jsref_parseInt.asp

提示和注释

注意:只返回字符串中的第一个数字!

注意:允许前导和尾随空格。

注意:如果第一个字符无法转换为数字,则 parseInt() 返回 NaN。

示例

解析不同的字符串:

<script type="text/javascript">

document.write(parseInt("10") + "<br />");
document.write(parseInt("10.33") + "<br />");
document.write(parseInt("34 45 66") + "<br />");
document.write(parseInt(" 60 ") + "<br />");
document.write(parseInt("40 years") + "<br />");
document.write(parseInt("He was 40") + "<br />");

document.write("<br />");
document.write(parseInt("10",10)+ "<br />");
document.write(parseInt("010")+ "<br />");
document.write(parseInt("10",8)+ "<br />");
document.write(parseInt("0x10")+ "<br />");
document.write(parseInt("10",16)+ "<br />");

</script>

以上代码的输出将是:
10
10
34
60
40
NaN

10
8
8
16
16

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