前阵子在stackOverflow上看到两个这样的问题:

为什么parseInt(8,3) == NaN,parseInt(16,3) == 1?

为什么parseInt('dsff66',16) == 13?

parseInt大家应该都很熟悉了,我们一般用他来把一个小数或字符串转换为整数,正常情况下我们都是这样做的:

parseInt(11.2)//返回11

parseInt(‘13’)//返回Number类型的13

函数会尝试逐个解析字符串中的字符,直到遇上一个无法被解析成数字的字符,然后返回该字符前所有数字字符组成的数字。

但是parseInt的第二个参数很多朋友就不太清楚了,因为本身就很少使用第二个参数,我们看看MDN上对第二个参数的解释:

一个2到36之间的整数值,用于指定转换中采用的基数。比如参数"10"表示使用我们通常使用的十进制数值系统。总是指定该参数可以消除阅读该代码时的困惑并且保证转换结果可预测。当忽略该参数时,不同的实现环境可能产生不同的结果。

最后说到如果忽略的话,不同环境会有不同结果,大家不用担心,ES5已经规定了如果省略就代表用十进制解析。

第二个参数是2~36之间的整数值,这个值其实就是我们说的进制,比如,我们用二进制去解析第一个参数,那么就这么做:

parseInt(101,2)//返回5

下面我们来分析一下上面的两个问题,相信大家对这第二个参数就能有个透彻的认识了。

为什么parseInt(8,3) == NaN,parseInt(16,3) == 1?

先来看第一个parseInt(8,3) ,这里的意思就是用,三进制去解析8,我们知道二进制是遇2进1,三进制同样,遇3进1,比如我要用三进表示十进制中的5,那么就是12,也就是(2*(3^0))+(1*(3^1))=5;

所以在三进制中,出现的最大的数字也就是2,8这个数字不可能出现在三进制中,所以返回NaN。

parseInt(16,3)同样,出现最大的数字是2,那么6就是被自动忽略掉,所以parseInt是直接用三进制去解析1,得到的当然是1了。

为什么parseInt('dsff66',16) == 13?

我们知道,平时使用parseInt,它会忽略到除数字之外的字符,但是这里不一样,因为十进制最大的数字是9,但是到了十一进制往上,最大的数字是两位数了,这当然不行,所以从10开始往上,就用字母代替,a==10,b==11......z==35;所以你知道为什么parseInt的第二个参数要规定在2~36了吗?

再看看上面这道问题,在16进制中,最大的数字是15,对应字母也就是f,超过f的字母也就超出了16进制的解析范围。

'dsff66'的第一个字符是d,也就是十进制中的13,第二个字符s,代表十进制中的28,这显然超出了16进制的解析范围,所以s和它之后的字符都会被parseInt自动忽略,所以我们得到13。

相信看到这里,你对parseInt的第二个参数已经完全了解了,如果你对进制之间的转换不太了解的话,可以多去网上学习学习进制之间的转换,就算平时用不着,还是可能拿来装X嘛。

另外补充一下,另一个函数parseFloat只接受一个参数,只能使用十进制去解析。

parseInt第二个参数详解的更多相关文章

  1. jQuery()方法的第二个参数详解

    关于jQuery()方法的第二个参数,有下面这几种用法: 1.jQuery(selector, [context]) 这种用法,相当于 $(context).find(selector) 或者 con ...

  2. iptables参数详解

    iptables参数详解 搬运工:尹正杰 注:此片文章来源于linux社区. Iptalbes 是用来设置.维护和检查Linux内核的IP包过滤规则的. 可以定义不同的表,每个表都包含几个内部的链,也 ...

  3. mha配置参数详解

    mha配置参数详解: 参数名字 是否必须 参数作用域 默认值 示例 hostname Yes Local Only - hostname=mysql_server1, hostname=192.168 ...

  4. 【转】jqGrid 各种参数 详解

      [原文]http://www.cnblogs.com/younggun/archive/2012/08/27/2657922.htmljqGrid 各种参数 详解 JQGrid JQGrid是一个 ...

  5. Linux 之 编译器 gcc/g++参数详解

    2016年12月9日16:48:53 ----------------------------- 内容目录: [介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++ ...

  6. cat常用参数详解

    cat常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 最近,我的一个朋友对linux特别感兴趣,于是我觉得每天交给他一个命令的使用,这样一个月下来也会使用30个命令,基 ...

  7. [转]GCC参数详解

    [介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件不转换成 ...

  8. scons用户指南翻译(附gcc/g++参数详解)

    scons用户指南 翻译 http://blog.csdn.net/andyelvis/article/category/948141 官网文档 http://www.scons.org/docume ...

  9. GCC参数详解

    GCC参数详解 [介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件 2.将预处理后的文件不转换成汇 ...

随机推荐

  1. preg_match_all正则表达式的基本使用

    了解正则表达式之前,须要掌握一些常用的正则表达式的基础知识,这些如果能记得最好记得,记不住须要用的时候能查到就行,就多个特殊字符,所以说正则表达式玩的就是特殊,具体大家可以查看更加细致的说明. pre ...

  2. angularjs + seajs构建Web Form前端(三) -- 兼容easyui

    回顾 在上一章中使用了angular实现了ajax form和树形结构,经过以上两章对于angular的大致使用,对于angular也有了初步的认识,接下来的内容只会对angular的一些用法做简单的 ...

  3. 推荐一款炫酷的提示框插件SweetAlert

    官方网址 http://t4t5.github.io/sweetalert/ 项目地址 https://github.com/t4t5/sweetalert

  4. php 分页类

    <?php /* *本程序文件对分页程序进行了封装 * */ class Page_Link { var $page_max = 10; //一组页码的最大数 var $page_num = 1 ...

  5. Java知多少(110)数据库之插入记录

    插入数据表记录有3种方案 一.使用Statement对象 实现插入数据表记录的SQL语句的语法是: insert into 表名(字段名1,字段名2,……)value (字段值1,字段值2,……) 例 ...

  6. Lambda动态创建

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. 3D全景!这么牛!!

    如果你用过网页版的百度地图,你大概3D全景图浏览是一种怎样的酷炫体验:在一个点可以360度环顾周围的建筑.景色,当然也可以四周移动,就像身临其境. 全景图共分为三种: ①球面全景图 利用一张全景图围成 ...

  8. Simplified CommonJS wrapper 与 AMD 标准定义模块差异

    标准的 AMD 模块定义 一个标准的 AMD 模块看起来是这样子: define(['foo', 'foo/bar'], function (foo, bar) { return { doSometh ...

  9. 【.Net底层剖析】2.stfld指令-给对象的字段赋值

    .Net底层剖析目录章节 1.[深入浅出.Net IL]1.一个For循环引发的IL 2.[.Net底层剖析]2.stfld指令-给对象的字段赋值 3.[.Net底层剖析]3.用IL来理解属性 引言: ...

  10. java中getBytes方法可能使图片文件产生的问题

    InputStream is = new FileInputStream(fl); ImageInputStream iis = ImageIO.createImageInputStream(is); ...