2017-07-07 59 views
3

我一直在Javascript中使用parseInt()函数,但没有传递radix参数。根据MDN文档here,声明不提供此参数可能会导致不可预知的行为。为什么建议为parseInt()提供可选的radix参数?

请始终指定此参数以消除读者的困惑,并确保可预测的行为。

有人能澄清这是什么不可预知的行为有一些代码示例是什么意思?

+0

*“时,没有指定基数,通常默认值以10不同实现产生不同的结果。” * – Li357

回答

4

在旧版本的语言中,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需要八进制文字“严格”模式的领先0o0O,但这并不适用于parseInt()这(在ES2015)仅覆盖为十六进制字符串的默认基数。

+0

@Bathsheba我我从来没有见过这种说法,但我当然不能说没有人会说这些话。 – Pointy

+2

@Bathsheba在[ECMAScript 6/ES2015](https://www.ecma-international.org/ecma-262/6.0/)中,八进制文字的格式为'0o',如二进制:'0b'和十六进制:' 0x'。 – Li357

+0

@AndrewLi在“严格”模式下是正确的;否则(为了不打破互联网)有“传统”模式,继续承认只是领先的'0'。但另一方面,我没有注意到关于ES2015(可能是因为我通常不需要八进制文字)。 – Pointy

-1

出于某种自己最为人所知的原因,指定此函数行为的人将基数设置为可默认参数,但随后决定将缺省值保留为实现! (也许坚持10的价值是明智的,但也许这会打乱70年代的民间编程,他们仍然认为八进制文字是有用的。)

因此,为了强大的编程,你需要提供基数参数你自己。

0

如果不提供基数,parseInt会尝试根据您传入的值确定正确的基数,例如,如果该值开始0x那么它将确定您必须传入十六进制值。同样适用于0(八进制)。

当您的输入为零填充但未提供基数时,这会变得有问题。其中结果将(可能)不按预期

console.log(parseInt(015))

+0

对于我来说,你明显处于专业领域的另一端,但是函数*是否必须以这种方式实现? – Bathsheba

+1

@Bathsheba我不知道。如果我正在写它,我可能会默认它为'10',因为它显然是99%的用户期望的。毕竟我们是10个基地的生物 – Jamiec

+1

@Bathsheba该语言的当前规范仍然坚持认识到前导的0x或0X表示一个十六进制常量,但只有当基数没有明确地作为参数传递时。 – Pointy

相关问题