为什么parseInt(“0x”)返回NaN

时间:2018-04-21 08:49:46

标签: javascript

在JavaScript中,当我们使用parseInt(参数)时,js将返回一个由字符串参数解析的num。

它解析字符串,直到第一个char不能成为数字。

,例如

console.log(parseInt("024x2")) // 24
console.log(parseInt("0b")) // 0

console.log(parseInt("0x")) // NaN

为什么不呢?

console.log(parseInt("0x")) // 0

我知道0x表示十六进制

4 个答案:

答案 0 :(得分:1)

使用parseInt("0x", 10)强制十进制系统,否则:

  

如果radix未定义或0(或不存在),则JavaScript假定以下内容:

     

如果输入字符串以" 0x"开头?或" 0X",基数为16(十六进制)>并解析字符串的其余部分。

答案 1 :(得分:1)

这在Mozilla reference documentation(强调我的)中有所解释:

  

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

     

...

     

如果radix未定义或0(或不存在),则JavaScript假定以下内容:

     
      
  • 如果输入字符串以" 0x&#34开头;或" 0X",radix为16(十六进制),并解析字符串的其余部分
  •   
  • 如果输入字符串以" 0"开头,则radix为8(八进制)或10(十进制)。究竟选择哪个基数是依赖于实现的。 ECMAScript 5指定使用10(十进制),但并非所有浏览器都支持此功能。因此,在使用parseInt时,请始终指定基数。
  •   
  • 如果输入字符串以任何其他值开头,则基数为10(十进制)。
  •   
     

如果第一个字符无法转换为数字,parseInt会返回NaN

注意第一个项目符号点与其他项目符号的不同之处 - 它表示"字符串的其余部分被解析"。我认为这意味着:

parseInt("0xfoo")

被视为等同于

parseInt("foo", 16)

无论什么" foo"是 - 在你的情况下。因此parseInt("0x")相当于parseInt("", 16)

所以,这是你的例子和输出的解释:

// radix is inferred as 8 or 10 (implementation-dependent)
// Parsing stops at "x" which is invalid in either radix.
// The first character was valid, so the result is 24 or 18.
parseInt("024x2")

// radix is inferred as 8 or 10 (implementation-dependent)
// Parsing stops at "b" which is invalid in either radix.
// The first character was valid, so the result is 0.
parseInt("0b")

// radix is inferred as 16, but then parsing *restarts* at
// an empty string. There's no valid first character at this
// point, so the result is NaN
parseInt("0x")

ECMA standard provides much more detail但Mozilla描述可能更容易理解。 ECMA版本符合我对&#34的理解;字符串的其余部分被解析"也 - 参见说明的第10步。

答案 2 :(得分:0)

0x是十六进制数的开头。你得到NaN,因为你有前缀,但没有任何指定数字值的数字。

答案 3 :(得分:0)

来自MDN

使用parseInt时,

  

如果输入字符串以“0x”或“0X”开头,则基数为16(十六进制),并解析字符串的其余部分。

由于 radix 之后没有任何内容,您将获得NaN