Dev*_*lli 191 javascript numbers parseint radix
我正在阅读这篇文章,但我对parseInt中使用radix参数章节所写的内容感到困惑
为什么parseInt(8, 3)
→ NaN
和parseInt(16, 3)
→ 1
?
据我所知8和16不基地,3个数字,所以parseInt(16, 3)
应该返回NaN
太
T.J*_*der 372
这是人们一直绊倒的事情,即使他们知道这件事.:-)你看到这个因为同样的原因parseInt("1abc")
返回1:parseInt
停在第一个无效字符并返回它在那一点上的任何东西.如果没有要解析的有效字符,则返回NaN
.
parseInt(8, 3)
表示" "8"
在基数3中解析"(请注意,它将数字8
转换为字符串; 规范中的详细信息).但在基地3个,个位数的数字只是0
,1
和2
.就像要求它以"9"
八进制解析一样.由于没有有效的字符,你得到了NaN
.
parseInt(16, 3)
要求它"16"
在基数3中进行解析.既然它可以解析1
它,它就会解析它,然后它就会停止,6
因为它无法解析它.所以它回来了1
.
由于这个问题引起了很多关注并且可能在搜索结果中排名很高,所以这里有一个简单的选项,用于将字符串转换为JavaScript中的数字,以及它们的各种特性和应用程序(取决于我的另一个答案):
parseInt(str[, radix])
- 尽可能多地将字符串的开头转换为整数(整数),忽略最后的额外字符.所以parseInt("10x")
是10
; 该x
被忽略.支持可选的基数(基数)参数,因此parseInt("15", 16)
是21
(15
十六进制).如果没有基数,则假定为十进制,除非字符串以0x
(或0X
)开头,在这种情况下,它会跳过那些并假定为十六进制.(有些浏览器用于处理0
以八进制开头的字符串;从未指定过该行为,并且在ES5规范中明确禁止该行为.)NaN
如果找不到可解析的数字,则返回.
parseFloat(str)
- 喜欢parseInt
,但是浮点数并且只支持小数.再串上多余的字符被忽略,所以parseFloat("10.5x")
是10.5
(将x
被忽略).因为只支持十进制,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 +].有一个问题:+""
是0
,不像NaN
你想象的那样.
Number(str)
- 完全像隐式转换(例如,像+
上面的一元),但在某些实现上更慢.(不是说它很重要.)
njz*_*zk2 54
出于同样的原因
>> parseInt('1foobar',3)
<- 1
Run Code Online (Sandbox Code Playgroud)
在doc中,parseInt
需要一个字符串.和
如果string不是字符串,则将其转换为字符串
所以16
,8
或者'1foobar'
首先转换为字符串.
然后
如果
parseInt
遇到的字符不是指定基数中的数字,则忽略它和所有后续字符
意味着它可以转换到它可以的位置.的6
,8
以及foobar
被忽略的,只有什么是之前被转换.如果没有,NaN
则返回.