面试题
let arr = [1, 2, 3, 4]
arr = arr.map(parseInt)
console.log(arr) // [1, NaN, NaN, NaN]
知识点:
map语法
arr.map(function(item, index){
console.log(item,index) // 1 0, 2 1, 3 2, 4 3
})
数组迭代方法(遍历数组中的每一项做一些特殊处理),常用的有:
forEach: 遍历数组的每一项(数组中有多少项,就会触发执行多少次回调函数,每一次迭代的当前项和当前项的索引传递给回调函数)
map:map和forEach类似,只不过支持返回值,回调函数中的返回值会把当前迭代的对象替换掉,例如
let arr = [1, 2, 3, 4]
arr = arr.map(function(item, index){
return item * index // 有返回值,将迭代对象替换了
})
console.log(arr) // [0, 2, 6, 12]
find:迭代数组每一项的时候,只要有一项在回调函数中返回true则找到内容,后面不会再迭代了,返回的是找到的这一项。没有符合条件的返回undefined。回调函数有3个参数(item,index,arr)www.jianshu.com/p/1c15be16a…
filter:迭代每一项的时候,回调函数中所有返回TRUE的这一项获取到,以新数组返回(包含筛选出来的所有项)blog.csdn.net/qq_39207948…
every:和some类似,但是回调函数都返回true,整体才是true.blog.csdn.net/zhuoganliwa…
some:验证数组中是否存在符合某个筛选条件的,只要有一个符合结果就是true
reduce:上一次回调函数中运算结果会作为下一次处理的信息,例如数组求和
www.cnblogs.com/xuejiangjun…
let total = arr.reduce(function(n, item){
return n + item
}, 0) // 10
// n的初始值是0,item是每一项。返回n+item的值 作为n的新值,再与每一项item相加
every和some 返回结果是布尔值
find和filter 返回的找到的某一项或所有相
forEach和map 就是循环遍历(迭代每一项)
reduce 能够接收上一次处理的结果
parseInt():
parseInt([value]):
把value转换为数字,要求value是字符串(不是字符串先默认转换为字符串),从字符串左边开始查找,找到有效数字字符转换为数字(遇到一个非有效的数字字符,则停止查找)
parseInt([value],[radix]):
首先[value]是要转的字符串,[radix]是进制,实际意义就是:把value看作radix进制的值,将这个值转为10进制的数,比如:parseInt('2AF5',16)其实就是将'2AF5'当作16进制的数,转换为10进制
- [radix]不传或者为0,则radix默认按照10进制进行处理(特殊:字符串以0x/0X开头,radix默认按照16进行处理)
- radix不在2~36之间,最后结果都是NaN
练习题
parseInt('2AF5', 16) // 把 '2AF5'当作16进制,转换为10进制
16进制怎么转为10进制?N进制的值转为10进制怎么转?:
- 首先parseInt会在第一个参数中,由左到右查找有效数,也就是说会在'2AF5'中查找有效数字(符合16进制的都是有效数字,本题中都符合)
- 有效数用num1,num2,num...表示,然后有效数从右开始数,索引从0开始,用index表示,进制数用N表示
- 那么公式就是:num1 * N ^ index + num2 * N ^ index.....
- 所以此题结果就是:
5 * 16^0 + F * 16^1 + A * 16^2 + 2 * 16^3
在16进制中

5 * 16^0 + 15 * 16^1 + 10 * 16^2 + 2 * 16^3
16^0 = 1
16^1 = 16
16^2 = 16*16....
所以最后结果为
5*1 + 15*16 + 10*16*16 + 2*16*16*16 = 10997

parseInt('12.75', 8)
- 首先parseInt 从左到右,如遇到非有效数字就停止查找,所以查找到.就停止了
- 实际上也就是 求 8进制12 转为10进制的值
parseIInt('12', 8)
- 套公式:
2*8^0 + 1* 8^1 = 2*1 + 1*8 = 10

求8进制'72.45'转为10进制的值?
'72.45'=?
- 整数部分
2*8^0 + 7*8^1 = 2*1 + 7*8 = 58
- 小数部分,从左到右数,索引从-1开始
4*8^-1 + 5*8^-2
n^-3 = 1/n * n * n (取倒数),所以
4*8^-1 + 5*8^-2 = 4*(1/8) + 5*(1/8*8) = 0.5+0.078125 = 0.578125
- 整数部分和小数部分相加
58+0.0.578125 = 58.578125
练习题:3进制转10进制
parseInt('23', 3)
- 3进制只能是0-2,所以查找到2的时候已经不是3进制的范畴了,则不再继续查找,所以
2*3^0 = 2*1 = 2
正题解析:
let arr = [1, 2, 3, 4]
arr = arr.map(parseInt)
console.log(arr)
- 已经知道map是数组的迭代方法, 方法本身应该传一个回调函数,当循环数组的每一项的时候会触发这个回调函数执行,并且把当前项以及当前项的索引作为参数分别传给回调函数,然后接受这个回调函数的返回结果,用返回结果来替换数组中的当前项。
arr.map(function(item, index){
.....
})
- 每迭代一次就会把回调函数触发一次
- arr = arr.map(parseInt),parseInt就是一个方法,所以每迭代一次都会执行一次parseInt()
- 循环数字中的第一项,执行一次parseInt,参数是当前项和当前项的索引
parseInt(1, 0)
parseInt(2, 1) // 循环第二次,执行parseInt,参数是当前项和当前项的索引
parseInt(3, 2) // 第三次
parseInt(4, 3) // 第四次
- parseInt第二个参数不传或为10,并且也不是0x/0X开头(0x开始默认是16进制)把1当作10进制转为10进制,结果还是1
parseInt(1, 0) // 1
- parseInt第二个参数不在2~36之间,结果是NaN
parseInt(2, 1) // NaN
- 把3当作2进制 转为10进制,但是2进制只能是0-1,所以3是无效数字,没找到可转换的字符串,结果是NaN
parseInt(3, 2) // NaN
- 把4当作3进制 转为10进制,3进制只能是0-2,同上4不是有效数字,结果是NaN
parseInt(4, 3) // NaN
- map之前已经说了,支持返回值,所以每次执行parseInt后的结果 都会替代当前项,所以新数组结果是
let arr = [1, 2, 3, 4]
arr = arr.map(parseInt)
console.log(arr) // [1, NaN, NaN, NaN]
总结补充:
- parseInt()支持2个参数,
- 第二个参数是数字几就表示将第一个参数看做几进制的数,并转为10进制
- 第二个参数不传或者为0,则默认第二个参数为10进制进行处理,但是如果第一个参数以0x/0X开头,第二个参数则默认按照16进制处理
- 第二个参数不在2~36之间,结果为NaN
- parseFloat不支持第二个参数
此题涉及的面试知识点:
- 关于数组中常用的迭代方法,写源码
- 进制转换
- parseInt和parseFloat的区别:
- parseInt和parseFloat都是用来把字符串转换为数字的,只不过它们和Number的区别是,它们都是把一个字符串按照从左到右依次查找的方式把有效数字找到,最后把转为数字的
- 只不过在,float在识别的过程当中比parseInt多识别一个小数点
- 但是parseInt相比较parseFloat而言,支持进制基础,够把要转换的参数当作相应的进制数,最后转换为10进制数。parseFlaot是不支持的