IE6/7/8中parseInt第一个参数为非法八进制字符串且第二个参数不传时返回值为0
JavaScript中数字有十进制、八进制、十六进制。以"0"开头的是八进制,"0x"或"0X"开头的是十六进制。
parseInt用来把字符串转换成整型数字,它接受两个参数,第一个参数为字符串,第二个为数字基数如8,10,16。
parseInt(string, radix)
当第二个参数不传时默认为10,即默认转成十进制的数字。
parseInt('7') // number 7
parseInt('8') // number 8
parseInt('9') // number 9
这三行代码在所有浏览器中都表现一致。
但第一个参数如果所传的是非法八进制数字,且第二个参数不传时,IE6/7/8将返回0,其它浏览器会忽略0返回,返回0后的数字。
parseInt('08') // IE678返回0,其它浏览器返回8
parseInt('09') // IE678返回0,其它浏览器返回9
0开头的为八进制,八进制只有0-7,"08", "09"显然是非法的八进制形式。IE6/7/8中返回的是0, 其它浏览器是8,9。
当然,如果是合法的八进制形式,IE6/7/8处理和其它浏览器一致,如
parseInt('01') // 1
parseInt('07') // 7
这应该算IE6/7/8的bug,IE9+的处理已经和Firefox/Chrome一致了。看下ES3规范

当radix为undefined或0时,且string不是以0x或0X开头则按十进制处理。显然,'08', '09'不是以 '0x' 或 '0X' 开头。IE6/7/8按八进制处理,8,9是非法的八进制数字,引擎忽略返回了0。
可以利用这个特性判断浏览器是否是IE6,7,8
var isIE678 = parseInt('08') === 0;
除此之外,parseInt有一下特征(所有浏览器都一样)
一、radix 不传或为假值时,默认按10进制处理 (JS六个假值)
alert(parseInt('9')) // 9
alert(parseInt('9', null)) // 9
alert(parseInt('9', undefined)) // 9
alert(parseInt('9', 0)) // 9
alert(parseInt('9', '')) // 9
alert(parseInt('9', NaN)) // 9
alert(parseInt('9', false)) // 9
二、默认会忽略左右空白符
alert(parseInt(' 9')) // 9
alert(parseInt('9 ')) // 9
alert(parseInt(' 9 ')) // 9
三、但不会去掉中间的空白符,且默认忽略中间空白符后所有的字符
alert(parseInt('9 0')) // 9
alert(parseInt(' 9 0 ')) // 9
alert(parseInt(' 9 a ')) // 9
四,以"0x"或"0X"开头的字符串一律按16进制处理,无论第二个参数radix传或不传或任意值
alert(parseInt('0xa')) // 10
alert(parseInt('0xa'), 8) // 10
alert(parseInt('0xa'), 16) // 10
alert(parseInt('0Xa')) // 10
alert(parseInt('0Xa'), 8) // 10
alert(parseInt('0Xa'), 16) // 10
最后附上ES5里parseInt的伪码实现 (parseInt 内部执行流程)
1 调用toString(string) ,即先把第一个参数转成字符串。
2 去掉string的两边空白符,赋值给S,如果 S 不包含一个字符,那么令S为空字符串。
3 令 sign = 1
4 如果 S 不是一个空字符串,且第一个字符为负号 "-", sign赋值为-1。
5 如果 S 不是一个空字符串,且第一个字符为正号 "+" 或负号 "-",去掉正负号。如 "+30" 变为了"30", "-30"变为"30"。
6 令 R = ToInt32(radix)
7 stripPrefix = true
8 R不为0时,如果 R < 2 或 R > 36,直接返回NaN,如果 R != 16,令 stripPrefix = false
9 R为0时,令 R = 10
10 stripPrefix为true时, 如果 S 的长度length大于2切前两个字符是"0x"或"0X",那么去掉 S 的前两个字符("0x"|"0X"),令R = 16。
11 如果 S 包含的任意字符不是一个有效的 radix-R 数字(比如"8"就不是一个有效的八进制数字),令 Z 为非有效进制数字前的字符,否则令 Z = S。
12 如果 Z 是一个空字符串,返回NaN。
13 令 mathInt 为由字符串 Z 指定的 radix-R进制的数字,使用A-Z和a-z替代数字10-35。
14 令 number 为数字类型的mathInt
15 返回 sign*number
IE6/7/8中parseInt第一个参数为非法八进制字符串且第二个参数不传时返回值为0的更多相关文章
- ES6中generator传参与返回值
先看两个例子, 1, function* f() { for(var i=0; true; i++) { var reset = yield i; if(reset) { i = -1; } } } ...
- ./g1.sh q w e r 5个参数 bash命令 获取 命令实际的参数 shell文件名称$0 第一个参数$1第2个参数$2 最后一个参数$#;参数个数$#个;所有的参数列出来$* 返回值$? 正确0 失败1
# ./g1.sh q w e r t./g1.sh q w e r5个参数number is q w e r t[root@localhost get]# cat g1.sh#!/bin/bash# ...
- 解读Java中BigDecimal.ZERO.compareTo()的返回值含义
Java compareTo() 用法 例如: public static void main(String[] args) { BigDecimal bnum1, bnum2; bnum1 ...
- javascript中parseInt(),08,09,返回0
javascript中在使用parseInt(08).parseInt(09),进行整数转换的时候,返回值是0 工具/原料 浏览器 文本编辑器 方法/步骤 javascript中在使用pa ...
- JS中函数参数和函数返回值的理解
函数本质就是功能的集合 JS中函数是对象,因此,函数名实际上仅仅是一个指向函数对象的指针,不会与某个函数绑定,所以,JS中没有重载(重载就是通过传递不同类型的参数,使两个相同函数名的函数执行不同的功能 ...
- Java实现 LeetCode 387 字符串中的第一个唯一字符
387. 字符串中的第一个唯一字符 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. 案例: s = "leetcode" 返回 0. s = ...
- 关于字符串replace方法第二个参数探究
网上有关replace的文章很多了,这里主要聊聊它的第二个参数.阅读本文需要对replace方法有一定了解.W3school=>replace 我们要把一段字符串中的某些指定字符替换掉,第一时间 ...
- 关于ExecuteNonQuery执行存储过程的返回值 、、实例讲解存储过程的返回值与传出参数、、、C#获取存储过程的 Return返回值和Output输出参数值
关于ExecuteNonQuery执行存储过程的返回值 用到过ExecuteNonQuery()函数的朋友们在开发的时候肯定这么用过. if(cmd.ExecuteNonQuery("xxx ...
- C#中的函数(二) 有参有返回值的函数
接上一篇 C#中的函数(-) 无参无返回值的函数 http://www.cnblogs.com/fzxiaoyi/p/8502613.html 这次研究下C#中的函数(二) 有参有返回值的函数 依然写 ...
随机推荐
- 字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组
涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟 ...
- KMP算法 --- 深入理解next数组
在KMP算法中有个数组,叫做前缀数组,也有的叫next数组. 每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符. 当然它描述的也是子串的对称程度,程度越高,值 ...
- P6 EPPM R16.1安装与配置指南(一)
标题 http://www.cnblogs.com/endv/p/5634620.html 安装与配置指南安装与配置指南(数据库)说明哪些How to set up the P6专业数据库和服务器.a ...
- json format validator
http://la5u.org/archives/542 http://stedolan.github.io/jq/download/ https://linuxtoy.org/archives/jq ...
- 程序设计模式 —— State 状态模式
我应该如何阅读? 本文将使用优雅的文字风格来告诉你什么是状态模式. 注意: 1.在阅读本文之前请保证你已经掌控了 面对对象的思想与 多态的基本概念,否则将难以理解. 2.本文实现将用C++实现,你不一 ...
- HTML5的新特性
HTML5 中的一些有趣的新特性: 用于绘画的 canvas 元素 用于媒介回放的 video 和 audio 元素 对本地离线存储的更好的支持 新的特殊内容元素,比如 article.footer. ...
- Erlang 内存泄漏分析
随着项目越来越依赖Erlang,碰到的问题也随之增加.前段时间线上系统碰到内存高消耗问题,记录一下troubleshooting的分析过程.线上系统用的是Erlang R16B02版本. 问题描述 有 ...
- .Net开源项目之开源论坛
.Net开源项目非常多,但是开源并且直接就能用的BBS项目就很少了,至少最近我在这上面没有找到一个合适的开源论坛.可能是因为我要求比较特殊,不但要开箱即用,还要用MVC+MySql开发. Discuz ...
- 移除NDK方法
以下内容由:于伟建 提供 删除.project中的以下字段基本都是有cdt关键字的位置 删除.cproject然后重启eclipse,clean,重新编译我这里还有错误,就手动删了gen 删除包含cd ...
- Play 内置模板标签(1.2.3版本)http://www.anool.net/?p=617
a标签: 用来插入一个连接到控制器方法的html link.如下: #{a @Application.logout()}Disconnect#{/a}模板内容被解析后变成: <a href=&q ...