为什么parseInt(8,3)== NaN和parseInt(16,3)== 1?
我正在读这篇文章,但是我对parseInt中用基数参数章写的内容感到困惑
为什么parseInt(8, 3)
→ NaN
和parseInt(16, 3)
→ 1
?
AFAIK 8和16不是基数3,所以parseInt(16, 3)
应该返回NaN
即使他们知道这一点,人们总是会绊倒他们。 :-)由于相同的原因,你会看到这个parseInt("1abc")
返回1: parseInt
停在第一个无效字符处,并返回它在这一点上的任何东西。 如果没有有效的字符需要parsing,则返回NaN
。
parseInt(8, 3)
意思是“parsing"8"
在基地3”(注意它将数字8
转换为一个string; 详细说明 )。 但是在第3位,单个数字只是0
和2
。 这就像要求它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
(或0X
)0x
,在这种情况下,它将跳过这些并假定为hex。 (一些浏览器用于将0
开头的string视为八进制;从未指定过这种行为,并且在ES5规范中明确禁止 )。如果找不到可分析的数字,则返回NaN
。 -
parseFloat(str)
– 像parseInt
一样,但是做了浮点数,只支持decimal。 再次忽略string中的额外字符,所以parseFloat("10.5x")
是10.5
(x
被忽略)。 由于只支持十进制,因此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
遇到一个不是指定基数中的数字的字符,它会忽略它和所有后续字符
意思是把它转换成可以的地方。 6
和foobar
被忽略,只有以前被转换。 如果什么都没有, NaN
被退回。