一、此面试题考察的内容
- 对于数组map函数的理解以及使用
- 对于parseInt的转换规则是否理解
对于map在实际开发中经常用到,这方法可能不是重点考察的,主要是对于parseInt的转换规则是否有全面理解
二、map和parseInt解析
- map解析
首先是map函数的使用,在遍历数组时传入一个callback回调函数,参数是数组值和下标值,然后将回调函数结果放进新数组并返回。代码如下:
//["1","2","3"].map(parseInt)
["1","2","3"].map(callback)
结果:[
callback("1",0),
callback("2",1),
callback("3",2),
]
//可以写为
["1","2","3"].map((item,index)=>{
return parseInt(item,index)
})
结果:[
parseInt("1",0),
parseInt("2",1),
parseInt("3",2),
]
2 parseInt解析
对于这个函数可能大家使用的是经常见到的进制转换,若是非常见进制或者非进制的规则就非常陌生了。
parseInt的进制规则如下:
1.parseInt(string[,radix]),parseInt接收两个参数,
2.string:将要被解析的值。该值需要为字符串,则会使用toString的方式将其转换为字符串。字符串前后的空白符将会被忽略
3.radix:表示字符串的转换基数,从2到36。指定radix为2,则表示将按照二进制的方式解析字符串;如果指定为10,则将按照10进制的方式解析字符串。需要注意的是,10不是radix的默认值,至于为什么,后文有详细的阐述。
4.如果输入的字符串的非空格字符以‘0x’或‘0X’开头,则radix会假定为16,字符串剩余的字符将按照16进制进行解析,如果输入的字符串的非空格字符以‘0’开头,radix可能为8或10,具体的根据不同的浏览器版本有所差别,但是ES5中规定,此种情况radix为10。输入的字符串的非空格字符是其他开头,则radix为10。
总结:
1.radix若是传递的是0、NaN、undefined,则分两种情况:
第一:若string以“0x”或“0X”开头,则默认为16进制
第二:若不是第一种情况则会10进制2.若进制小于2或者大于36,就会输入NaN
3.若是2-36,而string是无效数字,则转为NaN
三、[“1”,“2”,“3”].map(parseInt)解析
parseInt("1",0),
parseInt("2",1),
parseInt("3",2),
1、parseInt(“1”,0)由于传入的radix是0,而string非“0x”或“0X”则进制为十进制,parseInt(“1”,0)则为parseInt(“1”,10),输入1
2、parseInt(“2”,1)由于radix是1,不在2-36区间,则输入NaN。
3、parseInt(“3”,2)的radix为2,在2-36区间,又因为在二进制中“3”是不存在的,为无效数字,则输出NaN
此时本题目已经解出来了,输入为[1,NaN,NaN]
四、思考题
1.下方题目将会输入上面
1.["0x11","0X12","1"].map(parseInt) //?
2.parseInt('013',2) //?