深入了解parseInt

有这样一道题目

["1", "2", "3"].map(parseInt);  //[1, NaN, NaN] 

为什么结果是这样?什么情况下返回NAN?

因为parseInt需要两个参数(val,radix),map传递了3个参数(elem,index,arr)。
如果想让parseInt(string,radix)返回NaN,有两种情况:

  • 第1个参数不能转换成数字;
  • 第2个参数不在2到36之间。

这里,我们猜测是第二种情况,重新定义parseInt(string,radix)函数试试。

//传递两个参数时
var
parseInt = function(string, radix) { return string + "-" + radix; }; ["1", "2", "3"].map(parseInt); //["1-0", "2-1", "3-2"]
//传递三个参数时
var parseInt = function(string, radix, obj) {
  return string + "-" + radix + "-" + obj;
};
["1", "2", "3"].map(parseInt);//["1-0-1,2,3", "2-1-1,2,3", "3-2-1,2,3"]
//传递四个参数时
var parseInt = function(string, radix, obj, other) {
  return string + "-" + radix + "-" + obj + "-" + other;
};
["1", "2", "3"].map(parseInt);
//["1-0-1,2,3-undefined", "2-1-1,2,3-undefined", "3-2-1,2,3-undefined"]

看见map方法确实向parseInt传递了三个参数,数组的值,索引,数组
["1", "2", "3"]中的索引为0,1,2,如果1作为parseInt方法的第二个参数值,肯定有问题,因为不在2到36之间,所以返回NAN。2作为parseInt方法的第二个参数值,没有问题,但是字符串"3"里面没有合法的二进制数,所以也返回NAN。谜题最终揭晓,下面做一个扩展。

["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16"].map(parseInt);
//[1, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 9, 11, 13, 15, 17, 19, 21]
parseInt("1", 0);    // 基数为0,默认10进制,返回1
parseInt("2", 1);    // 基数为1,不在2-36范围内,默认输出NaN
parseInt("3", 2);    // 基数为2,因为字符串3大于基数不合法,解析为NaN
parseInt("4", 3);    // 三进制
parseInt("5", 4);
parseInt("6", 5);
parseInt("7", 6);
parseInt("8", 7);
parseInt("9", 8);
parseInt("10", 9);   // 九进制 (1*9+0 = 9)
parseInt("11", 10);  // 十进制 (1*10+1 = 11)
parseInt("12", 11);
parseInt("13", 12);
parseInt("14", 13);
parseInt("15", 14);
parseInt("16", 15);

 

转载于:https://www.cnblogs.com/camille666/archive/2012/09/22/js_parseint.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值