['1','2','3'].map(Number.parseInt)
这个面试题的答案是什么? 第一想象是不是对数组里的元素挨个取整然后返回一个新数组? 那就错了
答案是 [1, NaN, NaN]
分析一波:
一、Map方法
定义和用法
map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map() 方法按照原始数组元素顺序依次处理元素。
注意: map() 不会对空数组进行检测。
注意: map() 不会改变原始数组。
array.map(function(currentValue,index,arr), thisValue)
它是一个匿名函数,有三个参数,分别是(当前元素,当前遍历的元素索引,和原数组) 但在这里由于parseInt只接受两个参数,所以arr被舍弃
array.map(parseInt(currentValue,index));
所以整个题就变成了 ['1','2','3'].map(parseInt)
parseInt('1',0); // 1
parseInt('2',1); // NaN
parseInt('3',2); // NaN
二、Number.parseInt 方法
语法:Number.parseInt(string, radix)
Number.parseInt() 函数可解析一个字符串,并返回一个整数。 官方的解释:
string要解析的值。如果string参数不是一个字符串,那么它将被转换为一个字符串。字符串参数中的空白字符将被忽略。radix表示上述字符串的基数(数学数字系统中的基数)的2到36之间的整数。指定10人类通常使用的十进制数字系统。始终指定此参数以消除读者的困惑并保证可预测的行为。没有指定基数时,不同的实现会产生不同的结果,通常默认值为10。
是不是看不懂再说啥,好像就是这个方法可以将字符串进行数字取整,radix好像是一个进制数;但radix不单单是一个进制数!!
完整看一下radix的解释
1、radix可选。
2、表示要解析的数字的基数。该值介于 2 ~ 36 之间。 3、如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。
4、如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。
还是模模糊糊的,不过终于在查阅资料,做完测试后,明白了radix的用法了
先说结论:Number.parseInt(string,radix)
- 首先将第一个参数string转为字符串,去掉字符串参数中的空白字符
- 再判断第二个参数radix,如果没有值或者值为0就默认为10,表明基数是10;如果值小于 2 或者大于 36 返回 NaN; 如果不是数字类型 值默认为10;如果值在规定范围里,则以该数为基数
- 再拿基数去对字符串进行一个一个对比判断,从字符串的第一位开始对比,如果第一位比基数大 就第一位就没通过,后序就不再比较,此时通过基数对比的就返回NaN;如果第一位比基数小,则通过基数对比,换下一位进行对比;遇到非数字则自动结束后序对比
- 对比结束后,会将对比后的数进行进制运算,进制数就取radix,得到最后的结果
三、测试:
parseInt("224.3",2) 当解析第一位2时,2不属于范围2内,所以得到"",所以走到这里直接把后面抛弃掉**,相当于parseInt("",2); ---最终得到NaN。
parseInt("224.3",3) 当解析224.3时,2属于范围内,所以得到2,但第三位4不属于范围,所以走到这里直接把后面全部抛弃掉, 相当于parseInt("22",3); ---根据进制算法,最终算出,从右往左 23^0+23^1 = 8
parseInt("2e24.3",4) 当解析2e24.3时,**第一位2属于范围内,接着第二位e不是数字,直接无法跟基数4判断,所以包含e及后序全部舍去, 所以,e24.3抛弃掉,只取2,相当于 parseInt("2",4); , 根据进制算法,最终算出,从右往左 2*5^0 = 2
现在再来看这三个运算,是不是觉得很简答了,虽然这个方法用处确实不大,但咋们搞懂还是不懵逼的状态好,respect!
parseInt('1',0); // 1
parseInt('2',1); // NaN
parseInt('3',2); // NaN