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

Javascript 为什么建议为parseInt()提供可选的基数参数?,javascript,parseint,Javascript,Parseint,我总是在Javascript中使用parseInt()函数,而不传递基数参数。根据MDN文档,声明不提供此参数可能会导致不可预测的行为 始终指定此参数以消除读卡器混淆并 保证可预测的行为 有人能用一些代码示例来澄清这种不可预测的行为意味着什么吗?在该语言的旧版本中,parseInt()会使函数遵守正常的JavaScript数字常量语法规则,包括识别前导零以表示八进制常量,前导0x表示十六进制常量。因此,如果您的代码没有明确地坚持以10为基数,带前导零的杂散(可能是用户提供的)数字将被解释为以8为

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

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


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

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

自ES5.1以来,base-8行为已经消失了(我认为;可能更早),但base-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的价值可能是明智的,但这可能会使20世纪70年代仍在考虑八字形有用的民间计划感到不安。)
因此,对于健壮的编程,您需要自己提供基数参数。

在不提供基数的情况下,
parseInt
尝试通过您传入的值确定正确的基数,例如,如果值开始
0x
,则它确定您必须传入十六进制值。这同样适用于
0
(八进制)

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


console.log(parseInt(015))
“当未指定基数时,不同的实现会产生不同的结果,通常默认值为10。”你显然处于专业知识范围的另一端,但函数是否必须以这种方式实现?@Bathsheba我不知道。如果我在写它,我可能会将它默认为
10
,因为这显然是99%的用户所期望的。我们是10号基地的生物all@Bathsheba当前的语言规范仍然坚持将前导0x或0x识别为十六进制常量,但仅当基数未作为参数显式传递时才如此。@Bathsheba我从未见过提到过这一点,但当然我不能说没有人对它耳语。@Bathsheba In,八进制文字的格式为
0o
,类似于二进制:
0b
和十六进制:
0x
@AndrewLi,这在“严格”模式下是正确的;否则(为了不破坏互联网),会出现“遗留”模式,该模式继续只识别前导
0
。但另一方面,我没有注意到关于ES2015(可能是因为我通常不需要八进制文字)。