让函数的参数能够接收别的函数
map:对数组以特定方式做映射 reduce:把数组中的结果按顺序和数列中的下一个元素做累积计算
var arr = [1,2,3,4,5]; arr.map(function(x){ return x*x; }); //[1,4,9,16,25] arr.reduce(function(x,y){ return x+y; }); //15练习:使用map/reduce实现String2Int函数(parseInt)
function string2Int(s){ //将字符串分割为一个数组(split),并将每个字符转化为数字 var arr = s.split('').map(function(x){ return x-'0'; }); var result = arr.reduce(function(x,y){ return x*10+y; }); return result; }注意点: map官方文档中说明为:map(callback [, thisArg]) callback为回调函数,它会自动从array中接受三个参数 1. element,即正在处理的数组中的元素 2. index,即正在处理的数组元素的下标 3. array,即正在处理的数组
thisArg为callback函数中的this,可以指定也可以不指定
所以,如果调用js自带的函数如parseInt的话,它会自动把这三个参数传递进去,这时parseInt实际执行的函数为:parseInt(arr[i], i, arr)
我们知道parseInt的函数定义为:parseInt(string, radix),即第一个参数为要转换为数字的string,第二个为要转换到的进制(2~36)
如果radix为undefined或者0或者没有传入的话,函数将根据以下规则进行判断
如果string以0x或者0X开头,那么这个字符串自动按照16进制数进行转换为十进制数字如果string以0开头,那么这个字符串自动按照8进制数或10进制数转换为10进制数字,ES5定义为按照10进制数字进行转换,但是并不是所有的浏览器都支持这个转换规则如果string以其他开头,那么这个字符串将按照10进制数进行转换在map中对parseInt的调用,由于js函数参数传递的宽松,它不会认为这个调用方式是错误的,它会把map中执行的parseInt的第二个参数分配给radix
那么这个又会对我们的map造成什么影响呢? 即如果对于数组arr[‘1’,’2’,’3’],使用arr.map(parseInt),想要将arr中的字符串转换为数字,那么实际调用的三次parseInt函数分别为:parseInt('1',0,arr),parseInt('2',1,arr),parseInt('3',2,arr) 可以看出,
对于第一个parseInt,函数可以正常的以十进制或者八进制进行转换(chrome为10进制),对于第二个parseInt,没有1进制的说法,返回NaN,对于第三个parseInt,可以以二进制来转换的字符串只能由0和1组成,3超出了二进制的表示范围,所以也会返回NaN所以这一节一个小小的总结就是: 1. 调用parseInt的时候一定要显式地传入radix进行指定 2. 在map中调用需要传入参数的函数的时候,可以用一个function把这个函数包裹起来,比如上述arr.map(parseInt)可以修改为如下形式:
arr.map(function(x){ return parseInt(x,10); });当然对于这个想要转换为十进制数的功能,在函数体里输入x-0更加方便:-)
参考: 官方文档map: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map parseInt https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt