Array.map中parseInt陷阱
- map、parseInt、forEach
["1","2","3"].map(parseInt).forEach(console.log);
//输出结果为:
1 0 [ 1, NaN, NaN ]
NaN 1 [ 1, NaN, NaN ]
NaN 2 [ 1, NaN, NaN ]
解释
- 先改造map部分为下面代码:
var m=["1","2","3"].map(parseInt)
console.log(m);
//输出结果为:
[ 1, NaN, NaN ]
这里为什么是[1,NaN,NaN]?
- parseInt的语法:
parseInt (string , radix)
其中第一个参数是 要转换的字符串,第二个参数是进制(默认为0,标识10进制)。
现在来看下面代码:
var m=["1","2","3"].map(parseInt)
console.log(m);
//等价于
var m=["1","2","3"].map((value,index)=>{
return parseInt(value,index);
})
console.log(m);
其中 parseInt 会被执行3次,分别是
- parseInt("1",0) 第二个参数是0,正常可以按照十进制把字符串"1",变为值类型1,
- parseInt("2",1) 第二个参数是1,目前还没有所谓的一进制,参数不合法,无法正常把"2" 转化类型
- parseInt("3",2) 第二个参数是2,目前2倒是合法进制参数,但是在二进制中,没有3这个数,二进制中只有0,1;所以还是不合法
- 最终结果就成了[1,NaN,NaN]
forEach(console.log)
此处forEach传递三个参数(value,index,arr).
加强练习
下列输出结果?
["1","2","11"].map(parseInt).forEach(console.log);