为啥 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
将数字截断为整数值。允许前导和尾随空格。...
如果
如果输入字符串以“0x”或“0X”开头,radix
未定义或为 0(或不存在),则 JavaScript 假定如下: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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 C printf 格式“%#x”打印 0(零)而没有前导“0x”?
为啥 abs(0x80000000) == 0x80000000?
非负十六进制转十进制报错“NumberFormatException”,parseInt 不接受 0x或 0X,必须去掉