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

Stu*_*ent 5 javascript parseint

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

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

有人可以通过一些代码示例澄清这种不可预测的行为意味着什么吗?

Poi*_*nty 5

在旧版本的语言中,parseInt()会导致函数遵守正常的 JavaScript 数字常量语法规则,包括识别前导零表示八进制常量,以及识别前导 0x 表示十六进制常量。因此,如果您的代码没有明确坚持以 10 为基数,则带有前导零的杂散(可能是用户提供的)数字将被解释为以 8 为基数的值,并将前导 0x 解释为十六进制。

自 ES5.1 以来,base-8 行为已经消失(我认为;可能更早),但 base-16 行为仍然存在。(可能前导 0x 作为意外前缀比简单的前导 0 更罕见。)

我在 Stack Overflow 上查看代码的经验parseInt()是无论如何都被过度使用了。这是一般清洁剂将字符串(通常,从DOM元素采取串.value属性)与一元数字+操作:

var count = +document.getElementById("count").value;
Run Code Online (Sandbox Code Playgroud)

当然,这不一定会给你一个整数。然而,它做的是注意到输入字符串有尾随的非数字垃圾。该parseInt()函数将简单地停止解析像“123abc”这样的字符串并为您123提供数值。+然而,领导会给你一个NaN.

如果你需要整数,你总是可以使用Math.floor()or Math.round()

编辑— 注释指出 ES2015 要求八进制文字的前导0o0O“严格”模式,但这不适用于parseInt()(在 ES2015 中)仅覆盖十六进制字符串的默认基数。

  • @Bathsheba 在 [ECMAScript 6/ES2015](https://www.ecma-international.org/ecma-262/6.0/) 中,八进制文字的格式为 `0o`,类似于二进制:`0b` 和十六进制:`0x `. (2认同)