一道面试题引发的x案

input: ["1", "2", "3"].map(parseInt)
output: 1, NaN, NaN

parseInt(string, radix) 解析一个字符串并返回指定基数的十进制整数, radix 是2-36之间的整数,表示被解析字符串的基数。

parseInt(string, radix)

  • string

    要被解析的值。如果参数不是一个字符串,会先使用toString 将其转换为字符串。字符串开头的空白符将会被忽略。

  • radix 可选

    236,表示解析字符串时指定的基数。例如指定 16 表示被解析值是十六进制数。注意,10不是默认值!

分而治之

parseInt函数会返回一个Int类型的值,返回的值由根据指定的基数解释字符串参数的内容决定 。字符串中的前导空格将被忽略。如果基数是未定义的或0,它被假定为10时的数与字符对开始除或,在这种情况下,假设16的基数。如果基数为16,则数字也可以选择以字符对或开头。0x 0X 0x 0X

parseInt函数被调用时,采取以下步骤:

  1. inputStringToString ( string )。

  2. SinputString 的一个新创建的子字符串,它由第一个不是 StrWhiteSpaceChar 的字符和该字符之后的所有字符组成。(换句话说,删除前导空格。)如果inputString不包含任何此类字符,则让S为空字符串。

  3. 符号为 1。

  4. 如果小号不是空的第一个字符小号是一个减号**-** ,让标志为-1。

  5. 如果小号不空的第一个字符小号是一个加号**+或减号-** ,然后从第一个字符小号

  6. R = ToInt32 (基数)。

  7. stripPrefixtrue

  8. 如果R ≠ 0,则

    1. 如果R < 2 或R > 36,则返回NaN
    2. 如果R ≠ 16,则让stripPrefixfalse
  9. 否则,R = 0

    1. R = 10
  10. 如果stripPrefixtrue,则

    1. 如果长度小号为至少2和的前两个字符小号要么“ 0X ”或“ 0X ”,然后从前两个字符小号和让 - [R = 16。
  11. 如果S包含任何不是基数R数字的字符,则让ZS的子串, 由第一个这样的字符之前的所有字符组成;否则,设ZS

  12. 如果Z为空,则返回NaN

  13. mathInt是由Z以基数R表示法表示的数学整数值,使用字母A - Za - z表示值为 10 到 35 的数字。(但是,如果 R是 10 并且Z包含超过 20数字,根据实现的选择,第 20 位之后的每个有效数字都可以替换为0数字;如果R不是2、4、8、10、16或 32,则mathInt可能是由Z以基数R表示法表示的数学整数值的依赖于实现的近似值。)

  14. numbermathInt的 Number 值。

  15. 返回符号×编号

笔记parseInt只能将字符串的前导部分解释为整数值;

它忽略任何不能被解释为整数符号的一部分的字符,并且没有给出任何此类字符被忽略的迹象。