关于Array的map方法中回调函数参数的问题

开门见山,我们先来看两个例子。

var arr=[‘1‘,‘4‘,‘9‘,‘16‘];

var r=arr.map(Math.sqrt);

猜猜r的结果会是多少?

没错就是

[1,2,3,4]

我们再来试试另一个,

var arr=[‘1‘,‘4‘,‘9‘,‘16‘];

var r=arr.map(parseInt);

再猜猜结果是多少?

是[1,2,3,4]?

console试一试看看结果是多少

[1,NaN,NaN,1]!

是不是大吃一惊

其实真相————

就是参数个数搞的鬼!

让我们再来看一个例子

var arr=[‘1‘,‘4‘,‘9‘,‘16‘];

var r=arr.map(function(x){return parseInt(x)});

r//[1,2,3,4]

结果是不是就正常了!

其实在调用

arr.map(parseInt);的时候

传给map的参数有三个

当前的值(currentValuve)//依次是‘1‘,‘4‘,‘9‘,‘16‘

当前值的索引(currentIndex)//依次是0,1,2,3

以及当前数组(currentArray)//[‘1‘,‘4‘,‘9‘,‘16‘],每次都是这个

而每次使用parseInt()函数的时候,却只传入了两个值(currentValue,currentIndex)

所以结果就是:

parseInt(‘1‘,0)//1

而第二个参数假如经过 Number 函数转换后为 0 或 NaN,则将会忽略。——Mozilla官方文档

parseInt(‘4‘,1)//非法,NaN

parseInt(‘9‘,2)//非法,NaN

parseInt(‘16‘,3)//这里指的注意,在解析字符串‘16‘的时候,发现6大于或等于3,所以其后的数字都被忽略,只剩下一个1返回了

如果 parseInt 遇到了不属于radix参数所指定的基数中的字符那么该字符和其后的字符都将被忽略。——Mozilla官方文档

最后知道真相的我们以后可千万得注意map函数中回调参数个数的问题啊!

var r=arr.map(function(x){return parseInt(x)});

时间: 2024-10-13 23:56:50

关于Array的map方法中回调函数参数的问题的相关文章

ajax中的post方法中回调函数不执行的问题

前一段时间接触了JQuery Ajax中的.post()方法和.get()方法,感觉到ajax的简洁和强大,当用到.post()方法时,去W3上查找相关的使用方法,感觉十分简单,用法很明了,然后,直接根据自己的需要(js将数据post给php写入数据库,然后返回给js一个值)开写了,写完了,运行,竟然不行!然后仔细地对比我的代码和demo的不同,为了查找错误,将我的代码写的几乎和demo相同了,但是还是无法在js中获得php的数据. 这里先回忆一下.post()方法. jQuery.post(u

C++中回调函数(CallBack)的使用

如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过. 其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而实现成员函数可以访问C++的数据成员.这也可以理解为什么C++类的多个实例可以共享成员函数却-有不同的数据成员.由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败.要解决这一问题的关键就是不让t

JavaScript中回调函数的使用

在JavaScript中,回调函数具体的定义为:函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A.我们就说函数A叫做回调函数.如果没有名称(函数表达式),就叫做匿名回调函数. 在实际应用中,可以这么应用,一个方法进行获取数据源,另一个方法(回调函数)可以通过数据源在页面上进行展示,可以根据具体的需求进行展示就行,如果多个地方用到这个数据源,可以写不同的回调函数,将此函数传入这个方法中即可. 来,咱们通过实例可以一目了然 获取公司信息的小例子 1.获取公司信息数据源的方法(

Android中回调函数的理解---本人Android纯新手

本人大二,刚刚接触Android,也刚刚申请的cnblog博客,说一下对Android中回调函数的理解,Android中回调函数和C++.JAVA中的默认构造函数差不多,即运行到了一定的代码时自动调用的代码,而Android中的回调函数和C++.JAVA中的默认构造函数的区别在于:C++.JAVA中的默认构造函数在创建一个对象时自动调用,而Android中的回调函数的自动调用是在比如按了HOME键之后.

Java中,函数参数的传递,是值传递还是引用传递

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  答:是值传递. 可以这么理解:有一个Person(name="S"),作为参数传给一个方法,在此方法中将此Person重新设置name=“B”,那么有一下结论 ①这个Person还是这个Person,一直都是他,但是他的名字被改了,不管是原来的引用还是方法里的引用,引用的都是一个对象,所以,所有引用的值都变了 ②如果在方法中重新new了一个Person赋给参数,

iOS 处理方法中的可变参数

## iOS 处理方法中的可变参数 最近写了一个自定义的对话框的demo,想模仿系统的UIAlertView的实现方式,对处理可变参数的时候,遇到了小问题,于是谷歌了一下,写下了处理问题的方法,记录下来,以备后需. 代码实现 - (instancetype)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelBut

关于java方法中Object... args参数的含义

关于java方法中Object... args参数的含义 在阅读google发布的volley源码时,突然看到一个方法中存在这样的写法,如 :v(String format, Object... args) 不明白什么意思,琢磨着为什么要这样写呢,跟Object[] args是一个意思吗?为什么用三个点代替呢?后来查阅了下文档,原来这是JDK1.5新增语法,新特性,动态参数或者是可变参数的意思. 举例: 有个方法v,调用v方法 v(里面写多少参数都行); 比如: v(1,"s"); v

javascript与jQuery的each,map回调函数参数顺序问题

<script> var arr = [2,3,6,7,9]; //javascript中的forEach 和 map方法 arr.forEach(function(value,index){//(值,索引) console.log(value); }); arr.map(function(value,index){//(值,索引) console.log(value); }); //jQuery的 each map方法 $(arr).each(function(index,value){//

js中回调函数,promise 以及 async/await 的对比用法 对比!!!

在编程项目中,我们常需要用到回调的做法来实现部分功能,那么在js中我们有哪些方法来实现回调的? 方法1:回调函数 首先要定义这个函数,然后才能利用回调函数来调用! login: function (fn) { var app = getApp() wx.login({ success: res => { let code = res.code; wx.getSetting({ success: res => { if (res.authSetting['scope.userInfo']) {