前阵子在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. Powerdesigner 16.5 从SQL Server 2012做逆向工程时提示:Unable to list tables问题

    公司深圳团队开发有一套系统在华北区这边推向客户,在一次更新补丁时,由于发生了数据字典的变更,但深圳团队并未给出数据库的更新脚本,只给了新版本的数据库创建脚本,为了保证客户方系统中已有数据不丢失,只能自 ...

  2. url rewrite

    http://www.microsoft.com/taiwan/technet/iis/expand/URLRewrite.aspx http://www.iis.net/learn/extensio ...

  3. 在内核中异步请求设备固件firmware的测试代码

    在内核中异步请求设备固件firmware的测试代码 static void ghost_load_firmware_callback(const struct firmware *fw, void * ...

  4. Android向系统相册中插入图片,相册中会出现两张 一样的图片(只是图片大小不一致)

    向系统相册中插入图片调用此方法时,相册中会出现两张一样的图片 MediaStore.Images.Media.insertImage 一张图片是原图一张图片是缩略图.表现形式为:android4.4. ...

  5. Visual Studio 2015开发Android App启动调试始终无法完成应用部署的解决方案

    创建一个Android App项目后,直接启动调试发现Visual Studio Emulator for Android已成功运行,但应用始终处于Build中(等待时间超过1小时),并未如预期通过a ...

  6. hbase安装

    HBase的安装 本篇介绍两种HBase的安装方式:本地安装方式和伪分布式安装方式. 安装的前提条件是已经成功安装了hadoop,而且hadoop的版本要和hbase的版本相匹配. 我将要安装的hba ...

  7. HTML5[4]:去除不必要的标签,完全使用css实现样式

    1)div.span的区别,div默认是沾满一行,span默认是inline 2)去除font之类的标签

  8. Linux内核Makefile文件(翻译自内核手册)

    --译自Linux3.9.5 Kernel Makefiles(内核目录documention/kbuild/makefiles.txt) kbuild(kernel build) 内核编译器 Thi ...

  9. 在C函数中保存状态:registry、reference和upvalues

    C函数可以通过堆栈来和Lua交换数据,但有时候C函数需要在函数体的作用域之外保存某些Lua数据,那么我们想到全局变量或static变量,这样做的缺点是:(1)为Lua设计C函数库时,导致不可重入:(2 ...

  10. 受限玻尔兹曼机(RBM)学习笔记(一)预备知识

    去年 6 月份写的博文<Yusuke Sugomori 的 C 语言 Deep Learning 程序解读>是囫囵吞枣地读完一个关于 DBN 算法的开源代码后的笔记,当时对其中涉及的算法原 ...