我一直在Javascript中使用parseInt()
函数,但没有传递radix参数。根据MDN文档here,声明不提供此参数可能会导致不可预知的行为。为什么建议为parseInt()提供可选的radix参数?
请始终指定此参数以消除读者的困惑,并确保可预测的行为。
有人能澄清这是什么不可预知的行为有一些代码示例是什么意思?
我一直在Javascript中使用parseInt()
函数,但没有传递radix参数。根据MDN文档here,声明不提供此参数可能会导致不可预知的行为。为什么建议为parseInt()提供可选的radix参数?
请始终指定此参数以消除读者的困惑,并确保可预测的行为。
有人能澄清这是什么不可预知的行为有一些代码示例是什么意思?
在旧版本的语言中,parseInt()
会导致函数遵循正常的JavaScript数值常量语法规则,包括识别前导零以表示八进制常量,以及前导0x表示十六进制常量。因此,如果你的代码没有明确坚持基数10,那么带有前导零的杂散(可能是用户提供的)数字将被解释为基8值,并且以十六进制开头0x。
自从ES5.1(我想;可能早些时候)以来,base-8的行为已经消失,但是基本的16行为仍然存在。 (可能前导的0x是一个偶然的前缀比一个简单的前导0更罕见)。
我的经验在堆栈溢出看这里的代码是parseInt()
无论如何被过度使用。这是通常清洁转换为字符串(通常,从DOM元素.value
性质采取字符串),以数字与一元+
操作:
var count = +document.getElementById("count").value;
这不一定给你一个整数,当然。但是,将所做的是注意到输入字符串具有尾随的非数字垃圾。 parseInt()
函数将停止解析像“123abc”这样的字符串,并将123
作为数字值。领先的+
会给你一个NaN
。
如果你需要整数,你总是可以使用Math.floor()
或Math.round()
。
编辑 —评论指出,ES2015需要八进制文字“严格”模式的领先0o
或0O
,但这并不适用于parseInt()
这(在ES2015)仅覆盖为十六进制字符串的默认基数。
出于某种自己最为人所知的原因,指定此函数行为的人将基数设置为可默认参数,但随后决定将缺省值保留为实现! (也许坚持10的价值是明智的,但也许这会打乱70年代的民间编程,他们仍然认为八进制文字是有用的。)
因此,为了强大的编程,你需要提供基数参数你自己。
如果不提供基数,parseInt
会尝试根据您传入的值确定正确的基数,例如,如果该值开始0x
那么它将确定您必须传入十六进制值。同样适用于0
(八进制)。
当您的输入为零填充但未提供基数时,这会变得有问题。其中结果将(可能)不按预期
console.log(parseInt(015))
*“时,没有指定基数,通常默认值以10不同实现产生不同的结果。” * – Li357