小编典典

为什么 parseInt(8,3) == NaN 和 parseInt(16,3) == 1?

all

我正在阅读这篇文章,但我对 parseInt
中使用基数参数
一章所写的内容感到困惑

parseInt(_, 3)
结果表

为什么会是这样parseInt(8, 3)——NaNparseInt(16, 3)—— 1

AFAIK 8 和 16 不是以 3 为底的数字,所以也parseInt(16, 3)应该返回NaN

前十个以 3
为底的自然数


阅读 72

收藏
2022-07-14

共1个答案

小编典典

这是人们一直在经历的事情,即使他们知道这一点。:-) 出于同样的原因,您会看到此parseInt("1abc")返回
1:parseInt在第一个无效字符处停止并返回其在该点的任何内容。如果没有要解析的有效字符,则返回NaN.

parseInt(8, 3)表示“以 3 为基数解析"8"”(请注意,它将数字转换8为字符串;详细信息在 spec
)。但在基数 3 中,个位数只是012。这就像要求它以"9"八进制解析。由于 没有
有效字符,您得到NaN.

parseInt(16, 3)要求它以"16"3 为底进行解析。由于它可以解析1,它可以解析,然后它停在 the
处,6因为它无法解析它。所以它返回1


由于这个问题引起了很多关注,并且可能在搜索结果中排名很高,所以这里有一个在 JavaScript
中将字符串转换为数字的选项的概要,以及它们的各种特性和应用程序(摘自我在 SO 上的另一个答案):

  • parseInt(str[, radix])- 尽可能多地将字符串的开头转换为一个整数(整数),忽略末尾的额外字符。parseInt("10x")也是如此10;被x忽略。支持可选的基数(数字基数)参数,所以parseInt("15", 16)2115十六进制)。如果没有基数,则假定为十进制,除非字符串以0x(或0X) 开头,在这种情况下,它会跳过这些并假定为十六进制。 (一些浏览器过去将字符串开头0视为八进制;该行为从未指定,并且在 ES5 规范中明确禁止NaN。)如果找不到可解析的数字,则返回。

  • parseFloat(str)- 像parseInt,但做浮点数并且只支持十进制。字符串上的额外字符再次被忽略,因此parseFloat("10.5x")10.5x忽略)。因为只支持十进制,parseFloat("0x15")所以是0(因为解析在 结束x)。NaN如果没有找到可解析的数字,则返回。

  • 一元+,例如+str- (例如,隐式转换) 使用浮点和 JavaScript 的标准数字表示法将 整个0x字符串转换为数字(只有数字和小数点 = 十进制;前缀 = 十六进制;0o前缀 = 八进制 [ES2015+]; 一些 实现对其进行了扩展将前导0视为八进制,但不是严格模式)。+"10x"NaN因为x不被 忽略+"10"10+"10.5"10.5,是,+"0x15"21+"0o10"8[ES2015+]。有个问题:+""is 0,不像NaN你想象的那样。

  • Number(str)- 完全像隐式转换(例如,像+上面的一元转换),但在某些实现上较慢。 (并不是说它可能很重要。)

2022-07-14