JS中parseInt();解析八进制问题

看例子:
parseInt("08", 8); // 0 为什么?
看相关资料说"08"中的8不是合法(合法8进制应该是0~7)的8进制数。所以返回0,
那么其他进制举例如下:
parseInt("2",2) // NaN 这里“2”也是非法的2进制数(合法2进制是0~1),但是此处是NaN,
parseInt("3",3) // NaN 这里“3”也是非法的3进制数(合法3进制是0~2),但是此处是NaN,
针对这种非法进制数,好像只有8进制是返回0,其他进制都是返回NaN,这是为什么,是特例吗?是规定吗?望各路大神指点,谢谢。。。

阅读 2.4k
4 个回答

parseInt("02",2)
2在2进制不和发 但0是合法的 所以忽略2保留0
同parseInt("5m") 返回5一样

这种一般直接去看js的规范比较好,es7 parseInt

clipboard.png

我们可以分析一下parseInt('08', 8)parseInt('8', 8)
parseInt('08', 8)

1. inputString = '08'
2. s = '08'
3. sign = 1
4. 不变
5. 不变
6. R = 8
7. stripPrefix = true
8. stripPrefix = false
9. 不变
10. 不变
11. Z = '0' // 因为8不是有效字符,所以被去掉
12. 不变 // Z不为空
13. mathInt = 0
14. return +0

parseInt('8', 8):

1. inputString = '8'
2. s = '8'
3. sign = 1
4. 不变
5. 不变
6. R = 8
7. stripPrefix = true
8. stripPrefix = false
9. 不变
10. 不变
11. Z = '' // 因为8不是有效字符,所以被去掉
12. return NaN // 因为此时Z变为空字符串,所以返回了NaN

所以,parseInt('08', 8)parseInt('8', 8)的区别在于'08'去掉非法字符后变成了'0',而'8'去掉非法字符后变成了'',导致第12步的时候第二个返回了NaN
这种东西没有为什么,其实就是规定,规定说了按照一系列的步骤去得到结果,不管你看着结果有多么不合理,但是只要是按照规定执行的结果,那就是合理的结果。所以遇到类似的问题,最好的方法就是去找规范,看看规范是怎么定义的。

parseInt(target:string, radix:number = 10)

注:es5以后这个函数不在自动解析八进制的字面量格式,必须指明第二个参数为8

工作原理:从字符串的开头进行扫描,跳过空格直到第一个合法的字符,到第一个不合法字符结束(不包含这个不合法字符),这之间的部分进行解析

"08"以8进制进行解析,第一个合法字符是"0",第一个不合法字符是"8",所以以8进制解析"0"结果是0

"8"以8进制进行解析,直接是不合法字符"8",不能解析则返回NaN

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题