首先,请允许我抄袭一段你知道的parseInt

 


以下节选自parseInt - JavaScript | MDN

实际上你连这些基础都没掌握

概述

parseInt() 函数将给定的字符串以指定基数(radix/base)解析成为整数。

语法

1
parseInt(string, radix);

参数

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

描述

parseInt 顶级函数,没有与任何对象关联。

parseInt 函数将第一个参数(字符串)解析并试图返回一个整数或者NaN(Not a Number)。如果结果不是NaN,那么返回值是把第一个参数看作是radix参数指定的进制下的数,然后把它转换成十进制的整数。例如:radix参数为10 将会把第一个参数看作是一个数的十进制表示,8 对应八进制,16 对应十六进制,等等。基数大于 10 时,用字母表中的字母来表示大于 9 的数字。例如十六进制中,使用 A 到 F。

如果 parseInt 遇到了不属于radix参数所指定的基数中的字符那么该字符和其后的字符都将被忽略。接着返回已经解析的整数部分。parseInt 将截取整数部分。开头和结尾的空白符允许存在,会被忽略。

在没有指定基数,或者基数为 0 的情况下,JavaScript 作如下处理:

  • 如果字符串 string 以"0x"或者"0X"开头, 则基数是16 (16进制).
  • 如果字符串 string 以"0"开头, 基数是8(八进制)或者10(十进制),那么具体是哪个基数由实现环境决定。ECMAScript 5 规定使用10,但是并不是所有的浏览器都遵循这个规定。因此,永远都要明确给出radix参数的值
  • 如果字符串 string 以其它任何值开头,则基数是10 (十进制)。

如果第一个字符不能被转换成数字,parseInt返回NaN。

算术上,NaN 不是任何一个进制下的数。你可以调用isNaN来判断 parseInt 是否返回 NaN。NaN 参与的数学运算其结果总是 NaN。

将整型数值以特定基数转换成它的字符串值可以使用 intValue.toString(radix).

示例

例子:使用 parseInt

以下例子均返回15

1
2
3
4
5
6
7
8
parseInt("F", 16);
parseInt("17", 8);
parseInt("15", 10);
parseInt(15.99, 10);
parseInt("FXX123", 16);
parseInt("1111", 2);
parseInt("15*3", 10);
parseInt("12", 13);

以下例子均返回 NaN:

1
2
parseInt("Hello", 8); // Not a number at all
parseInt("546", 2);   // Digits are not valid for binary representations
 

以下例子均返回 -15:

1
2
3
4
5
6
7
8
9
parseInt("-F", 16);
parseInt("-0F", 16);
parseInt("-0XF", 16);
parseInt(-15.1, 10);
parseInt(" -17", 8);
parseInt(" -15", 10);
parseInt("-1111", 2);
parseInt("-15e1", 10);
parseInt("-12", 13);

下例中也全部返回 17,因为输入的 string 参数以 "0x" 开头时作为十六进制数字解释,而第二个参数假如经过 Number 函数转换后为 0 或 NaN,则将会忽略。

1
2
3
parseInt("0x11", 16);
parseInt("0x11", 0);
parseInt("0x11");

下面的例子返回 224

1
parseInt("0e0",16);
 

没有指定 radix 参数时的八进制解析

尽管 ECMAScript 3 已经不赞成这种做法,且 ECMAScript 5 已经禁止了这种做法,但是仍然有很多实现环境仍然把以 0 开头的数值字符串(numeric string)解释为一个八进制数。下面的例子可能返回八进制的结果,也可能返回十进制的结果。总是指定一个基数(radix)可以避免这种不可靠的行为。

1
2
parseInt("0e0"); // 0
parseInt("08"); // 0, '8' is not an octal digit.

ECMAScript 5 移除了八进制解析

ECMAScript 5 规范不再允许parseInt函数的实现环境把以0字符开始的字符串作为八进制数值。ECMAScript 5 陈述如下:

The parseInt function produces an integer value dictated by interpretation of the contents of the string argument according to the specified radix. Leading white space in string is ignored. If radix is undefined or 0, it is assumed to be 10 except when the number begins with the character pairs 0x or 0X, in which case a radix of 16 is assumed. If radix is 16, number may also optionally begin with the character pairs 0x or 0X.

这与ECMAScript 3有所不同,ECMAScript 3仅仅是不提倡这种做法但并没有禁止这种做法。

直至2013年,很多实现环境并没有采取新的规范所规定的做法, 而且由于必须兼容旧版的浏览器,所以永远都要明确给出radix参数的值.

一个更严格的解析函数

有时采用一个更严格的方法来解析整型值很有用。此时可以使用正则表达式:

1
2
3
4
5
6
7
8
9
10
11
12
13
filterInt = function (value) {
   if(/^(\-|\+)?([0-9]+|Infinity)$/.test(value))
       return Number(value);
   return NaN;
}
console.log(filterInt('421'));               // 421
console.log(filterInt('-421'));              // -421
console.log(filterInt('+421'));              // 421
console.log(filterInt('Infinity'));          // Infinity
console.log(filterInt('421e+0'));            // NaN
console.log(filterInt('421hop'));            // NaN
console.log(filterInt('hop1.61803398875'));  // NaN
console.log(filterInt('1.61803398875'));     // NaN
 

 好,看完上面的内容大部分小伙伴都觉得掌握了parseInt(),下面出一道考题考一下。

 
What is the result of this expression? 
 
["1""2", "3"].map(parseInt)
["1", "2", "3"][1, 2, 3][0, 1, 2]other
答案解析:
what you actually get is [1, NaN, NaN] because parseInt takes two parameters (val, radix) and map passes 3(element, index, array)
这道题的正确答案是[1,NaN,NaN],只要弄清楚数组的map方法传给回调函数parseInt的参数就很容易顿悟,map函数传递的三个参数,回调函数会使用前两个参数,第一项为某一项元素,第二项为该元素下标索引。上述的表达式等价于
1
2
3
parseInt("1",0);//1,前面说过基数为0时的处理情况(请回头看)
parseInt("2",1);//NaN,在1进制里2不是有效数字,有效数字只有0
parseInt("3",2);//NaN,在二进制里3不是有效数字
 
所以你觉得我是真的掌握了parseInt(),看下面的例子:
  1. console.log(parseInt(0.000001));
  2. console.log(parseInt(0.0000001));
所以你觉得输出会是什么呢:
            第一条语句输出 0, 第二条语句输出 1
细心的你有没有发现这里传给parseInt的参数并不是字符串而是一个浮点数。
查看ECMA规范

规范中介绍了执行该函数的第一步是将参数转换成字符串,通过调用toString方法。

1
2
console.log(0.000001.toString());//0.000001
console.log(0.0000001.toString());//1e-7
对于小于 1e-6 的数值来说,ToString 时会自动转换为科学计数法。现在你知道上面结果是如何产生的了!

2016年6月19日续

 
 

趁热打铁,我们再看一个例子:

1
parseInt("010");
前面提到过ES5取消了八进制自动解析,所有其结果根据浏览器版本会有区别:标准浏览器中(默认支持ES5),输出10,IE8和IE8以下是输出8;

下面我们不传入字符串而是传入8进制字面量

1
parseInt(010);//8

前面我们知道参数首先要调用toString()方法.

1
console.log(010.toString());//8
所以在所有的浏览器中上式都是8.
针对八进制的解析小结:非严格模式的下:
1.在IE9或者IE9以上还有其他标准浏览器中,如果参数是字符,并不会对其进行八进制转换,如果参数是八进制字面量,从最终结果看是按照八进制方式进行了转换。
2.在IE8和IE8以下浏览器中,无论传入的是字符串还是八进制字面量,都会按照八进制方式进行转换。
现在我们看下一严格模式下的情况:
1.如果参数是字符,严格模式下和非严格模式下是相同的,都是按照相应的ES版本解析。

2.如果参数是八进制字面量

1
2
"use strict"
console.log(parseInt(010));//IE9及以下不支持严格模式,解析为8,IE10及以上解析会出错:strict 模式下不允许使用八进制数字参数和转义字符
 
 

你不知道的parseInt的更多相关文章

  1. 你不知道的getComputedStyle

    你不知道的getComputedStyle jQuery的css()的底层实现就用到了getComputedStyle这个方法,也许我们用到的很少,但是不得不说这时一个非常强大的函数,下面让我们一探究 ...

  2. 【读书笔记】-- 你不知道的JavaScript

    <你不知道的JavaScript>是一个不错的JavaScript系列书,书名可能有些标题党的意思,但实符其名,很多地方会让你有耳目一新的感觉. 1.typeof null === &qu ...

  3. 你不知道的JavaScript--Item22 Date对象全解析

    本篇主要介绍 Date 日期和时间对象的操作. 1. 介绍 1.1 说明 Date对象,是操作日期和时间的对象.Date对象对日期和时间的操作只能通过方法. 1.2 属性 无: Date对象对日期和时 ...

  4. 你不知道的JavaScript--Item2 浮点数精度

    理解JavaScript的浮点数 大多数编程语言都有几种数值型数据类型,但是JavaScript却只有一种.你可以使用typeof 运算符查看数字的类型.不管是整数还是浮点数,JavaScript都将 ...

  5. 你不知道的JavaScript--Item3 隐式强制转换

    JavaScript的数据类型分为六种,分别为null,undefined,boolean,string,number,object. object是引用类型,其它的五种是基本类型或者是原始类型.我们 ...

  6. MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  7. MySQL 系列(二) 你不知道的数据库操作

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 本章内容: 查看\创建\使用\删除 数据库 用户管理及授权实战 局域网 ...

  8. Integer.parseInt 引发的血案

    Integer.parseInt 处理一个空字符串, 结果出错了, 程序没有注意到,搞了很久, 引发了血案啊!! 最后,终于 观察到了, 最后的部分: Caused by: java.lang.NoC ...

  9. 《你不知道的JavaScript》整理(二)——this

    最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,这次研究了一下“this”. 当一个函数被调用时,会创建一个活动记录(执行上下文). 这个记录会包含函 ...

随机推荐

  1. Ubuntu使用MyEclipse闪退的解决办法

    修改myeclipse.ini文件, -Xmx512m-XX:MaxPermSize=512m-XX:ReservedCodeCacheSize=256m-Dosgi.nls.warnings=ign ...

  2. css基于绝对定位的垂直水平居中技术

    翻译:http://blog.csdn.net/freshlover/article/details/11579669 原文:http://coding.smashingmagazine.com/20 ...

  3. Django简单的数据库操作

    当然,本篇的前提是你已经配置好了相关的环境,这里就不详细介绍. 一. 在settings.py文件中设置数据库属性. 如下: DATABASES = { 'default': { 'ENGINE': ...

  4. Java中 NIO与IO的区别

    当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代 ...

  5. 【Unity3D】AR应用中,关于东南西北方位的判断。

    这篇文章的应用场景是这样子的: 首先我们要做的是一个带有LBS定位服务(比如高德地图.百度地图等)AR功能,在这个场景中,会有一些地图上的”点“(如派出所.学校)是我们需要显示在我们的AR镜头上的,如 ...

  6. <<< commons-fileupload 和 ajaxfileupload 实现局部上传

    最近弄了一个上传,要求实现页面的局部刷新,Java的上传组件大多还是用的 commons-fileupload,网上搜索了好多的教程,太麻烦了,看到了ajaxfileupload这个插件,不错,实现简 ...

  7. 【原】fiddler修改线上的内容

    摘要:当我们线上的代码出bug了,咋办呢?有时候本地的代码跟线上的代码还是运行环境还是有区别的.比如有些封装的方法需要运动到手机上可以调试,而浏览器是无法调试的.如果不想每次修改完再放上到测试环境看效 ...

  8. 交换机--Switch

    交换机(Switch)意为"开关"是一种用于电(光)信号转发的网络设备.它可以为接入交换机的任意两个网络节点提供独享的电信号通路.最常见的交换机是以太网交换机. 这里的" ...

  9. Solr学习总结(四)Solr查询参数

    今天还是不会涉及到.Net和数据库操作,主要还是总结Solr 的查询参数,还是那句话,只有先明白了solr的基础内容和查询语法,后续学习solr 的C#和数据库操作,都是水到渠成的事.这里先列出sol ...

  10. 小白搭建一个网站(DouPHP)

    1)安装phpStudy_2014_setup.1413444920.exe 并启动数据库 2)将软件自带的WWW实例替换成我发的这个模板(DouPHP),网上也可以下载. 能找到更好模板的也可以不用 ...