为什么建议为parseInt()提供可选的radix参数?

时间:2017-07-07 12:53:16

标签: javascript parseint

我总是在Javascript中使用parseInt()函数而不传递radix参数。根据MDN文档here,它声明不提供此参数可能会导致不可预测的行为。

  

始终指定此参数以消除读者混淆和   保证可预测的行为。

有人可以澄清这种不可预测的行为对某些代码示例的意义吗?

3 个答案:

答案 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要求八进制文字的“严格”模式中的前导0o0O,但这不适用于{{1其中(在ES2015中)仅覆盖十六进制字符串的默认基数。

答案 1 :(得分:0)

如果不提供基数,parseInt会尝试通过传入的值确定右基数是什么,例如,如果值开始0x,则它确定您必须传入十六进制值。同样适用于0(八进制)。

当您的输入为零填充但未提供基数时,这会出现问题。结果将(可能)不符合预期



console.log(parseInt(015))




答案 2 :(得分:-1)

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

因此,对于强大的编程,您需要自己提供radix参数。