我总是在Javascript中使用parseInt()
函数而不传递radix参数。根据MDN文档here,它声明不提供此参数可能会导致不可预测的行为。
始终指定此参数以消除读者混淆和 保证可预测的行为。
有人可以澄清这种不可预测的行为对某些代码示例的意义吗?
答案 0 :(得分:4)
在该语言的旧版本中,parseInt()
会导致函数遵循常规的JavaScript数值常量语法规则,包括识别前导零表示八进制常量,前导0x表示十六进制常量。因此,如果你的代码没有明确地坚持基数10,那么带有前导零的杂散(可能是用户提供的)数字将被解释为base-8值,并将0x作为hex传递。
自从ES5.1以来,base-8的行为已经消失了(我想;可能早一点),但基本的16行为仍然存在。 (可能前导0x作为偶然前缀比简单前导0更为罕见。)
我在Stack Overflow上查看代码的经验是parseInt()
无论如何都被过度使用了。 通常更清晰,将字符串(通常是从DOM元素.value
属性中获取的字符串)转换为带有一元+
运算符的数字:
var count = +document.getElementById("count").value;
当然,这不一定会给你一个整数。但是,它将做的是注意到输入字符串具有尾随非数字垃圾。 parseInt()
函数将停止解析类似“123abc”的字符串,并将123
作为数值。但是,前导+
会为您提供NaN
。
如果您需要整数,可以随时使用Math.floor()
或Math.round()
。
编辑 - 注释指出ES2015要求八进制文字的“严格”模式中的前导0o
或0O
,但这不适用于{{1其中(在ES2015中)仅覆盖十六进制字符串的默认基数。
答案 1 :(得分:0)
如果不提供基数,parseInt
会尝试通过传入的值确定右基数是什么,例如,如果值开始0x
,则它确定您必须传入十六进制值。同样适用于0
(八进制)。
当您的输入为零填充但未提供基数时,这会出现问题。结果将(可能)不符合预期
console.log(parseInt(015))

答案 2 :(得分:-1)
由于某些原因,他们自己最熟悉,指定此函数行为的民众将基数设置为可默认的参数,但随后决定将默认值保留为实现! (也许坚持10的价值是明智的,但也许这会让20世纪70年代的民间计划感到不安,他们仍然认为八进制文字是有用的。)
因此,对于强大的编程,您需要自己提供radix参数。