JavaScript中的函数parseInt(string, radix)解析
好的,我们来详细解析 console.log(parseInt("10+15", 2));
这个例子,并深入讲解 parseInt(string, radix)
函数的工作原理。
直接答案
console.log(parseInt("10+15", 2));
的输出结果是 2
。
这个结果可能出乎意料。下面我们一步步拆解,告诉你为什么是 2
。
函数定义:parseInt(string, radix)
作用:解析一个字符串参数,并返回一个指定基数(进制)的整数。
string
:要被解析的值。如果参数不是字符串,则会使用ToString
抽象操作将其转换为字符串。字符串开头的空白符会被忽略。radix
(基数):一个介于2
到36
之间的整数,表示字符串的进制。这个参数非常重要且容易出错。
核心解析过程
parseInt
的工作流程可以概括为:
忽略前缀空白:
parseInt(" 10")
会忽略空格,解析"10"
。逐字符解析:函数会从左到右依次检查字符串中的每个字符,直到遇到一个不属于指定进制的有效数字的字符为止。
截断并转换:将找到的有效数字字符序列截取出来,并将其解释为指定进制的数字,最后转换为十进制整数返回。
忽略无效后缀:第一个无效字符之后的所有内容都会被完全忽略。
逐步拆解 parseInt("10+15", 2)
现在,我们应用上述规则来解析你的例子:
确定基数(radix):
radix = 2
。这意味着我们要将字符串当作二进制数字来解析。二进制中有效的数字字符只有'0'
和'1'
。开始逐字符解析字符串
"10+15"
:第一个字符:
'1'
。这是一个有效的二进制数字。保留。第二个字符:
'0'
。这是一个有效的二进制数字。保留。第三个字符:
'+'
。这是一个无效的二进制数字字符!二进制里根本没有
'+'
这个符号。根据规则,
parseInt
会在此处停止解析。
截取有效部分:函数成功解析了
"10"
这两个字符,并忽略了"+15"
这后面的所有内容。转换有效部分:现在,将截取到的二进制字符串
"10"
转换为十进制数字。二进制
10
等于十进制(1 * 2^1) + (0 * 2^0) = 2 + 0 = 2
。
返回结果:函数返回十进制数字
2
。
所以,console.log(parseInt("10+15", 2));
在控制台打印出的结果就是 2
。
其他关键点和常见陷阱
radix
为0
、undefined
或未提供:字符串以
0x
或0X
开头,会被解释为十六进制。字符串以
0
开头,且无法被解释为十六进制,现代 JavaScript 引擎(ES5之后)会将其解释为十进制。这是一个重要的变化,旧浏览器可能仍会将其当作八进制。其他情况被解释为十进制。
最佳实践:为了代码清晰和避免意外,请始终明确指定
radix
参数!
parseInt("0x10"); // 16, 因为以 '0x' 开头,被当作十六进制 parseInt("010"); // 10, ES5以后是十进制。以前可能是8(八进制) parseInt("10"); // 10, 默认十进制// 最佳实践:总是写上基数 parseInt("010", 10); // 10 (明确指定十进制)
第一个字符就无法转换:
如果字符串的第一个非空字符就无法转换为数字,
parseInt
会返回NaN
。
parseInt("Hello", 10); // NaN ('H' 不是数字) parseInt("", 10); // NaN (空字符串) parseInt("$100", 10); // NaN ('$' 不是数字)
科学计数法:
parseInt
不会处理科学计数法,它会在e
或E
处停止解析。
parseInt("123e456", 10); // 123 (在 'e' 处停止)
与
parseFloat()
的区别:parseInt
解析整数,遇到非数字字符(包括小数点.
)就会停止。parseFloat
解析浮点数,只认第一个小数点,遇到第二个小数点或非数字字符时停止。
parseInt("10.5", 10); // 10 (遇到 '.' 停止) parseFloat("10.5"); // 10.5parseInt("10.5.6", 10); // 10 parseFloat("10.5.6"); // 10.5 (在第二个 '.' 处停止)
总结
parseInt("10+15", 2)
的结果是2
。原因是:函数以二进制(基数为2)模式解析字符串
"10+15"
。它成功解析了前两个有效的二进制数字
"10"
,然后在无效的'+'
字符处停止。二进制
"10"
转换为十进制后就是2
。
核心记住:parseInt
是“贪婪”的,但它也很“挑剔”。它会尽可能多地获取有效的数字字符,但一旦遇到无效字符,就立刻停止工作,并返回之前已解析部分的结果。