深入了解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);
时间: 2024-08-03 09:12:41

深入了解parseInt的相关文章

Integer.parseInt()和valueOf()

parseInt("1")返回的是int类型,所以如果想要将一个String类型的数字串转为原始类型int ,建议使用这个方法, 而不是使用 valueOf("1"). 因为valueOf 返回的是Integer类型,调用该方法时内部也调用了parseInt 并且自动封装为Integer 类型.且通过valueOf 输出的值赋值给int 类型实际还需要Integer 自动拆箱为int类型, 通过编译后的class 我们看到实际 是该Integer 类型又调用了 in

parseint和parsefloat总结number。隐形转换

parseint:会认识一些字符+.-.空格,其他的就会截止譬如23hudhchauch结果为:23,对于boollen类型不能转换为1或是0. number:是对整体的转换.对true的转换为1. 显式类型转换(强制类型转换):Number()parseInt()parseFloat() 隐式类型转换: + 200 + '3' 变成字符串 - * / % '200' - 3 变成数字 ++ -- 变成数字 > < 数字的比较 .字符串的比较 ! 取反 把右边的数据类型转成布尔值 ==*/ /

Javascript - IE8下parseInt()方法的取值异常

公司的测试小妹妹跑来对我说,下拉框第9项始终无法正确提交的时候,我还以为见鬼了. parseInt()会把'0'开头的数字以8进制来解析,当有大于7的数字时候就按10进制来解析. // parseInt语法定义:radix为可选参数,默认为10进制. parseInt(string,radix); 08.09两个数字默认当成8进制转换,未成功所以就返回0.,然而IE8很敬业地以8进制来解析,不顾10进制的感受. 解决方案:指定进制参数 parseInt(’08’,10);

JavaScript基础使用parseInt()转换整数(005)

parseInt()可以把一个字符串格式的整数解析一个整数数值,如"32 days"将被解析为32.这个函数还接受第二个参数,指定整数的进制(当然,一般来说应该是十进制).一个好的习惯是,总是使用这第二个参数,以防一些意外的Bug的出现. var month = "06", year = "09", DECIMAL = 10: month = parseInt(month, DECIMAL); year = parseInt(year, DECI

JavaScript基础 parseInt() 于字符串从左往右提取整数

镇场诗: 清心感悟智慧语,不着世间名与利.学水处下纳百川,舍尽贡高我慢意. 学有小成返哺根,愿铸一良心博客.诚心于此写经验,愿见文者得启发.------------------------------------------ code: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=ut

Integer.parseInt不同jdk源码解析

执行以下代码: System.out.println(Integer.parseInt("-123")); System.out.println(Integer.parseInt("+123")); 以下仅提供1.6和1.7两个版本的比较  1.6版本执行结果为:    1.7版本执行结果为: 从两方面去查证结果的原因,分别是:查看API文档 和 查看对应的源代码 [查看API文档]  1.6版本对应的API文档:    1.7版本对应的API文档: 可以看出,对第

Javascript parseInt()和parseFloat()的用法

parseInt()方法首先查看位置0处的 字符,判断它是否是个有效数字:如果不是,该方法将返回NaN,不再继续执行其他操作.但如果该字符是有效数字,该方法将查看位置1处的字符,进行同样的 测试.这一过程将持续到发现非有效数字的字符为止,此时parseInt()将把该字符之前的字符串转换成数字. parseFloat()方法从位置0开始查看每个字符,直到找到第一个非有效的字符为止,然后把该字 符之前的字符串转换成数字. 不过,对于这个方法来说,第一个出现的小数点是有效字符.如果有两个小数点,第二

js parseInt()函数中的问题。。

今天在看<javascript 高级程序设计>时, 与我的输出结果不符合, <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <script> document.writeln(parseInt("11",8)); //9 document.wr

JavaScript中的parseInt和Number函数

函数作用: parseInt将字符串(String)类型转为整数类型. Number() 函数把对象(Object)的值转换为数字. 语法不同: parseInt(string, [radix]) string:必选参数,要被转换的字符串 radix:可选,数字的基数.取值范围在2~36. 如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN. <pre name="code" class="javascript"> alert(