为啥 parseInt("0x") 返回 NaN [重复]

Posted

技术标签:

【中文标题】为啥 parseInt("0x") 返回 NaN [重复]【英文标题】:why parseInt("0x") return NaN [duplicate]为什么 parseInt("0x") 返回 NaN [重复] 【发布时间】:2018-10-01 21:35:31 【问题描述】:

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

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

比如

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

但是

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

为什么不呢?

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

我知道 0x 表示十六进制

【问题讨论】:

parseInt() 函数解析字符串参数并返回指定基数(数学数字系统中的基数)的整数。 我认为链接的答案根本不是重复的。当然,它说“0x”是为了表示十六进制,但它没有解释 parseInt 的行为。 别担心,我重新打开了它。 @Durga:这个问题仍然不是重复的 - 链接的问题没有询问 parseInt("0x") 并且没有答案解释为什么返回 NaN。 【参考方案1】:

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

如果 radix 未定义或为 0(或不存在),JavaScript 假定如下:

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

【讨论】:

【参考方案2】:

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

【讨论】:

这不是应该标记为重复吗? @AnkitAgarwal 这发生在我发布之后。 很好,它发生了:)【参考方案3】:

来自MDN

使用parseInt时,

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

由于 radix 之后没有任何内容,因此您得到的是 NaN

【讨论】:

【参考方案4】:

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

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

...

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

如果输入字符串以“0x”或“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 版本也符合我对“解析字符串的其余部分”的理解——参见描述的第 10 步。

【讨论】:

以上是关于为啥 parseInt("0x") 返回 NaN [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ssd1306高地址起始为啥是0x10

为啥会出现(0x800A0E7A)错误?

为啥会出现(0x800A0E7A)错误?

为啥 abs(0x80000000) == 0x80000000?

["1", "2", "3"].map(parseInt) 结果

为啥我在 C# 中收到“无法读取属性 HRESULT:0x80650002”?