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

2020/10/19 03:01 · javascript ·  · 0评论

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

parseInt(_,3)结果表

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

据我所知8和16都没有基本的3个数字,所以parseInt(16, 3)应该返回NaN

前十个以3为底的自然数

人们一直在旅行,即使他们知道这一点。:-)出于相同的原因,您会看到以下内容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)也是如此如果没有基数,则假定为小数,除非字符串以(或开头,在这种情况下,它会跳过这些并假定为十六进制。(某些浏览器以前将字符串以八进制开头对待;该行为从未指定,在ES5规范中特别不允许。)如果未找到可解析的数字,则返回21150x0X0NaN

  • 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 +]。有一个陷阱:+""0NaN与您预期的不同。

  • Number(str)-完全类似于隐式转换(例如,像+上面的一元转换),但是在某些实现上速度较慢。(这并不重要。)

出于同样的原因

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

doc中,使用parseInt一个字符串。

如果字符串不是字符串,则将其转换为字符串

因此16,,8'1foobar'首先转换为字符串。

然后

如果parseInt遇到指定基数中非数字的字符,它将忽略该字符以及所有后续字符

意思是它可以转换到可以转换的地方。68以及foobar被忽略的,只有什么是之前被转换。如果什么都没有,NaN则返回。

/***** Radix 3: Allowed numbers are [0,1,2] ********/
parseInt(4, 3); // NaN - We can't represent 4 using radix 3 [allowed - 0,1,2]

parseInt(3, 3); // NaN - We can't represent 3 using radix 3 [allowed - 0,1,2]

parseInt(2, 3); // 2   - yes we can !

parseInt(8, 3); // NaN - We can't represent 8 using radix 3 [allowed - 0,1,2]

parseInt(16, 3); // 1  
//'16' => '1' (6 ignored because it not in [0,1,2])    

/***** Radix 16: Allowed numbers/characters are [0-9,A-F] *****/ 
parseInt('FOX9', 16); // 15  
//'FOX9' => 'F' => 15 (decimal value of 'F')
// all characters from 'O' to end will be ignored once it encounters the out of range'O'
// 'O' it is NOT in [0-9,A-F]

其他示例:

parseInt('45', 13); // 57
// both 4 and 5 are allowed in Radix is 13 [0-9,A-C]

parseInt('1011', 2); // 11 (decimal NOT binary)

parseInt(7,8); // 7
// '7' => 7 in radix 8 [0 - 7]

parseInt(786,8); // 7 
// '78' => '7' => 7 (8 & next any numbers are ignored bcos 8 is NOT in [0-7])

parseInt(76,8); // 62 
// Both 7 & 6 are allowed '76' base 8 decimal conversion is 62 base 10 
本文地址:http://javascript.askforanswer.com/weishenmeparseint83-nanheparseint163-1.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!