02.js - arr.map(parseInt)【一道面试题的解析】

一道前端面试题

['1', '2', '3'].map(parseInt)
神奇的运行结果:[1, NaN, NaN]

为什么会这样?????

  • 首先,map函数语法:

var new_array = arr.map(function callback(currentValue[, index[, array]]) { // Return element for new_array }[, thisArg])

第一个元素表示要处理的元素,第二个参数表示该元素的索引

  • 其次,parsInt语法

parseInt(string, radix) 解析一个字符串并返回指定基数的十进制整数, radix 是2-36之间的整数,表示被解析字符串的基数。
它的语法为: parseInt(string, radix)。string表示要被解析的值,radix是个可选参数,值从 2 到 36,表示字符串的基数。例如指定 16 表示被解析值是十六进制数。请注意,10不是默认值!

  • 所以,题目执行顺序为:

    • parseInt('1', 0) //radix为0,且string参数不以“0x”和“0”开头时,按照10为基数处理。返回1
    • parseInt('2', 1) //基数为1(1进制),最大值小于2,无法解析,返回NaN
    • parseInt('3', 2) //基数为2(2进制),2进制的值只有0和1,无法解析,返回NaN
  • 结果:由于map函数返回的是一个数组,所以最终返回[1, NaN, NaN]

那对其它可能的数组测试结果如何??
[0,2,1].map(parseInt)
=> [0, NaN, 1]

[10,3,2,4,5,6,7,8].map(parseInt)
=> [10, NaN, NaN, NaN, NaN, NaN, NaN, NaN]

[1110,30,0,2,3,6,7,8].map(parseInt)
=> [1110, NaN, 0, 2, 3, NaN, NaN, NaN]

[0,2,1,2,3,4,5,6,8,8,9,10,13].map(parseInt)
=> [0, NaN, 1, 2, 3, 4, 5, 6, NaN, 8, 9, 11, 15]

[0,2,1,2,3,4,5,6,7,8,9,10,13].map(parseInt)
=> [0, NaN, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 15]

以上可见,相同的数值在不同数组位置解析结果会各不相同(但是可能需要仔细的辨认分析哦),对parseInt的解析规律进行总结可列:

结论:parseInt不同基数解析的规律

  1. 基数为0: string转换为十进制后,不管值为多少,结果都为0;
  2. 基数为1: string转换为十进制后,不管值为多少,结果都为NaN;
  3. 基数为2: string转换为十进制后,除0和1之外,其余结果均为NaN(二进制只有0和1两个数);
  4. 基数在3-9之间: string转换为十进制后,若小于基数(大于0),则结果为转换为十进制后的数;若转换后大于基数,且小于10,结果为NaN;若大于等于10,按照规则转换;
  5. 基数为10: string转换为十进制后的值本身;
  6. 基数大于等于11: 按照不同基数数值之间的规则转换,比如:
    parseInt(11,5) = 1*5^0 + 1 * 5^1 = 6
    parseInt(101,25) = 1*25^0 + 0*25^1 + 1 * 25^2 = 626

以上。

美好祝愿:早日上岸!

结后语

猜你喜欢

转载自blog.csdn.net/qq_29517595/article/details/118759509
今日推荐