parseInt
用法记录。
语法
1 | parseInt(string, radix) |
参数
- string 要被解析的值。如果不是
String
类型的,会被转为String
。 - radix 可选 | 取值范围:从
2
到36
,代表string
参数的进制。如radix: 10
,代表string
的内容应按照10进制解析。
返回值
要么是从string
参数解析出的一个整数,要么就是NaN
。
规则
- 允许
string
参数前后带有空格,解析时会被忽略。 string
参数中的有效字符,从前到后依次解析。- 如果解析遇到的字符不能被转换为
radix
参数所对应进制中的有效数字,则会忽略该字符以及所有后续字符,并返回到该字符为止已解析的整数值。2进制的有效数字是0、1,10进制有效数字是0~9,16进制有效数字是0~9、A~F。 - 超过10进制,A~Z这些字母,可用来表示数字,比如16进制里面,A~F可以用来表示10~15之间的数。
- 当
radix
等于1,或大于36,返回值一定是NaN
。 - 当
string
中的第一个非空格字符,不能被转换为radix
对应进制中的有效数字,返回值一定是NaN
。 - 解析可以理解正负号,但是符号只允许出现一次。
- 非常大或非常小的数字,在字符串表示形式中,会使用e字符,所以在使用parseInt时会有意外结果。
特殊地,如果radix
是undefind
、0
、未指定,则radix
实际值按照如下规则判定:
- 如果
string
的有效数字部分以0x
或0X
开头,则radix
会被判定为16。 - 如果
string
的有效数字部分以0
开头,则radix
会被判定为8或10,取决于实现。ES5明确规定应该判定为10,但不是所有浏览器都遵守了这个规定。 - 如果
string
的有效数字部分以其它值开头,则radix
被判定为10。
举例
举例一:
1 | //1. |
解析:
- 37超出了
radix
的36
.
是第一个非空格字符,不能转换为数字,
是第一个非空格字符,不能转换为数字2
不是2进制的有效数字(0,1)A
是16进制中的有效数字,对应10进制的10,所以可以被成功解析- 第一个字符无法转为8进制的有效数字
举例二:
1 | // 1 |
解析:
- 去掉空格后,正确地解析了符号和数字
- 有2个符号,第二个符号会被当成普通字符尝试解析为数字,结果失败,导致最后结果为NaN
- 负号后面还有一个空格,这个空格,不是位于
string
参数的首尾,会被当成第一个字符尝试解析为数字,结果失败,导致最后结果为NaN
举例三:以下例子均返回15
1 | parseInt("0xF", 16); //将0xF当成16进制解析 |
举例四:以下例子均返回4
1 | parseInt(4.7, 10); |
解析:上面3个例子的第一个参数不是字符串类型,所以会被转换为字符串:1
2
3Number(4.7, 10) + ""; // "4.7"
Number(4.7 * 1e22, 10) + ""; // "4.7e+22"
Number(0.00000000000434, 10) + ""; // "4.34e-12"
所以说:
非常大或非常小的数字,在字符串表示形式中,会使用e字符,所以在使用parseInt时会有意外结果。
举例五
请问下面代码的执行结果:1
['1', '2', '3'].map(parseInt)
正确答案是:1
[1, NaN, NaN]
这是因为Array.prototype.map
方法的签名是:1
2
3var new_array = arr.map(function callback(currentValue[, index[, array]]) {
// Return element for new_array
}[, thisArg])
当parseInt
被传入map
的第一个参数时,parseInt
真正被调用时会传入三个参数,分别是元素、元素索引以及数组本身,那么['1', '2', '3'].map(parseInt)
就等同于以下三个调用:1
2
3parseInt('1', 0) // `radix`被指定为0,ES5规定这种情况下`radix`应该被判定为10,所以最终结果是1
parseInt('2', 1) // `radix`被指定为1,结果一定是NaN
parseInt('3', 2) // `radix`被指定为2,3不是2进制的有效数字,所以结果也是NaN