一道前端面试题
['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为基数处理。返回1parseInt('2', 1)
//基数为1(1进制),最大值小于2,无法解析,返回NaNparseInt('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不同基数解析的规律
- 基数为0: string转换为十进制后,不管值为多少,结果都为0;
- 基数为1: string转换为十进制后,不管值为多少,结果都为NaN;
- 基数为2: string转换为十进制后,除0和1之外,其余结果均为NaN(二进制只有0和1两个数);
- 基数在3-9之间: string转换为十进制后,若小于基数(大于0),则结果为转换为十进制后的数;若转换后大于基数,且小于10,结果为NaN;若大于等于10,按照规则转换;
- 基数为10: string转换为十进制后的值本身;
- 基数大于等于11: 按照不同基数数值之间的规则转换,比如:
parseInt(11,5) = 1*5^0 + 1 * 5^1 = 6
parseInt(101,25) = 1*25^0 + 0*25^1 + 1 * 25^2 = 626
以上。
美好祝愿:早日上岸!