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

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

parseInt(_,3)结果表

为什么parseInt(8, 3)NaNparseInt(16, 3)1

AFAIK 8和16不是基数3,所以parseInt(16, 3)应该返回NaN

前十个基数为3的自然数

即使他们知道这一点,人们总是会绊倒他们。 :-)由于相同的原因,你会看到这个parseInt("1abc")返回1: parseInt停在第一个无效字符处,并返回它在这一点上的任何东西。 如果没有有效的字符需要parsing,则返回NaN

parseInt(8, 3)意思是“parsing"8"在基地3”(注意它将数字8转换为一个string; 详细说明 )。 但是在第3位,单个数字只是02 。 这就像要求它parsing八进制的"9" 。 由于没有有效的字符,你有NaN

parseInt(16, 3)要求它parsing基数3中的"16" 。因为它可以parsing1 ,所以它会停止在6因为它不能parsing它。 所以它返回1


由于这个问题引起了很多关注,并且可能在search结果中排名很高,下面是JavaScript中用于将string转换为数字的选项的概要,以及它们各自的特质和应用(从我这里的另一个答案中解除):

  • parseInt(str[, radix]) – 尽可能多地将string的开头转换为整数(整数),最后忽略多余的字符。 所以parseInt("10x")10 ; x被忽略。 支持一个可选的基数(基数)参数,所以parseInt("15", 16)21 (hex中的15 )。 如果没有基数,则假定为十进制,除非string以0x (或0X0x ,在这种情况下,它将跳过这些并假定为hex。 (一些浏览器用于将0开头的string视为八进制;从未指定过这种行为,并且在ES5规范中明确禁止 )。如果找不到可分析的数字,则返回NaN

  • parseFloat(str) – 像parseInt一样,但是做了浮点数,只支持decimal。 再次忽略string中的额外字符,所以parseFloat("10.5x")10.5x被忽略)。 由于只支持十进制,因此parseFloat("0x15")0 (因为parsing在x处结束)。 如果没有find可分析的数字,则返回NaN

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

  • Number(str) – 完全像隐式转换(例如,像上面的一元+ ),但是在一些实现上更慢。 (并不是说这很重要)

出于同样的原因

 >> parseInt('1foobar',3) <- 1 

在文档中 , parseInt接受一个string。 和

如果string不是一个string,那么它被转换成一个string

因此, '1foobar''1foobar'首先被转换为string。

然后

如果parseInt遇到一个不是指定基数中的数字的字符,它会忽略它和所有后续字符

意思是把它转换成可以的地方。 6foobar被忽略,只有以前被转换。 如果什么都没有, NaN被退回。