数值转换-parseInt()函数

265 阅读3分钟

parseInt()函数在转换字符串时,更多的是看其是否符合数值模式。它会忽略字 符串前面的空格,直至找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt() 就会返回 NaN;也就是说,用 parseInt()转换空字符串会返回 NaN(Number()对空字符返回 0)。

如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了 一个非数字字符。例如,"1234red"会被转换为 1234,因为"red"会被完全忽略。类似地,"22.5" 会被转换为 22,因为小数点并不是有效的数字字符。 如果字符串中的第一个字符是数字字符,parseInt()也能够识别出各种整数格式(即前面讨论的 十进制、八进制和十六进制数)。也就是说,如果字符串以"0x"开头且后跟数字字符,就会将其当作一 个十六进制整数;如果字符串以"0"开头且后跟数字字符,则会将其当作一个八进制数来解析。 为了更好地理解 parseInt()函数的转换规则,下面给出一些例子:

var num1 = parseInt("1234red"); // 1234
var num2 = parseInt(""); // NaN 
var num3 = parseInt("0xA"); // 10(十六进制数)
var num4 = parseInt(22.5); // 22 
var num5 = parseInt("070"); // 56(八进制数)
var num6 = parseInt("70"); // 70(十进制数)
var num7 = parseInt("0xf"); // 15(十六进制数)

在 ECMAScript 3 JavaScript 引擎中,"070"被当成八进制字面量,因此转换后的值是十进制的 56。 而在 ECMAScript 5 JavaScript 引擎中,parseInt()已经不具有解析八进制值的能力,因此前导的零会 被认为无效,从而将这个值当成"70",结果就得到十进制的 70。在 ECMAScript 5 中,即使是在非严格 模式下也会如此。 为了消除在使用 parseInt()函数时可能导致的上述困惑,可以为这个函数提供第二个参数:转换 时使用的基数(即多少进制)。如果知道要解析的值是十六进制格式的字符串,那么指定基数 16 作为第 二个参数,可以保证得到正确的结果,例如:

实际上,如果指定了 16 作为第二个参数,字符串可以不带前面的"0x",如下:

var num1 = parseInt("AF", 16); //175 
var num2 = parseInt("AF"); //NaN 

这个例子中的第一个转换成功了,而第二个则失败了。差别在于第一个转换传入了基数,明确告诉 parseInt()要解析一个十六进制格式的字符串;而第二个转换发现第一个字符不是数字字符,因此就 自动终止了。 指定基数会影响到转换的输出结果。例如:

jsvar num1 = parseInt("10", 2); //2 (按二进制解析)
var num2 = parseInt("10", 8); //8 (按八进制解析)
var num3 = parseInt("10", 10); //10 (按十进制解析)
var num4 = parseInt("10", 16); //16 (按十六进制解析)

不指定基数意味着让 parseInt()决定如何解析输入的字符串,因此为了避免错误的解析,我们建 议无论在什么情况下都明确指定基数。