博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IE6/7/8中parseInt第一个参数为非法八进制字符串且第二个参数不传时返回值为0
阅读量:5742 次
发布时间:2019-06-18

本文共 2173 字,大约阅读时间需要 7 分钟。

JavaScript中数字有十进制、八进制、十六进制。以"0"开头的是八进制,"0x"或"0X"开头的是十六进制。

parseInt用来把字符串转换成整型数字,它接受两个参数,第一个参数为字符串,第二个为数字基数如8,10,16。

parseInt(string, radix)

 

当第二个参数不传时默认为10,即默认转成十进制的数字。

parseInt('7')   // number 7parseInt('8')   // number 8parseInt('9')   // number 9

这三行代码在所有浏览器中都表现一致。

 

但第一个参数如果所传的是非法八进制数字,且第二个参数不传时,IE6/7/8将返回0,其它浏览器会忽略0返回,返回0后的数字。

parseInt('08') // IE678返回0,其它浏览器返回8parseInt('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进制处理 ()

alert(parseInt('9')) // 9alert(parseInt('9', null)) // 9alert(parseInt('9', undefined)) // 9alert(parseInt('9', 0)) // 9alert(parseInt('9', '')) // 9alert(parseInt('9', NaN)) // 9alert(parseInt('9', false)) // 9

 

二、默认会忽略左右空白符

alert(parseInt(' 9')) // 9alert(parseInt('9 ')) // 9alert(parseInt(' 9 ')) // 9

  

三、但不会去掉中间的空白符,且默认忽略中间空白符后所有的字符

alert(parseInt('9 0')) // 9alert(parseInt(' 9 0 ')) // 9alert(parseInt(' 9 a ')) // 9

 

四,以"0x"或"0X"开头的字符串一律按16进制处理,无论第二个参数radix传或不传或任意值

alert(parseInt('0xa'))     // 10alert(parseInt('0xa'), 8)  // 10alert(parseInt('0xa'), 16) // 10alert(parseInt('0Xa'))     // 10alert(parseInt('0Xa'), 8)  // 10alert(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

 

转载地址:http://gvnzx.baihongyu.com/

你可能感兴趣的文章
数据结构及算法基础--优先队列(Priority Queue)
查看>>
C#使用Timer.Interval指定时间间隔与指定时间执行事件
查看>>
最浅显易懂的数据库索引讲解
查看>>
tcp/ip基础知识
查看>>
Apache许可翻译
查看>>
你必须非常努力,才能看起来毫不费力[转载]
查看>>
js遍历集合
查看>>
树链剖分——树形到线性的转化
查看>>
老赵 MSDN Webcast ASP.NET MVC框架开发系列课程
查看>>
姑娘你大胆地往前走——答大二学生XCL之八问
查看>>
UVA196
查看>>
ios 自定义delegate(一)
查看>>
创建美国地区的appleId
查看>>
例题10-2 UVa12169 Disgruntled Judge(拓展欧几里德)
查看>>
[c语言]c语言中的内存分配[转]
查看>>
JS 原生ajax写法
查看>>
day 10 字符编码和文件处理 细节整理
查看>>
如何打造亚秒级加载的网页1——前端性能
查看>>
「陶哲軒實分析」 習題 3.5.9
查看>>
报表如何自动刷新实时显示时间?
查看>>