为什么建议为 parseInt() 提供可选的基数参数?
Why is it recommended to provide optional radix parameter to parseInt()?
我一直在Javascript中使用parseInt()
函数而不传递radix参数。根据 MDN 文档 here,声明不提供此参数可能会导致不可预测的行为。
Always specify this parameter to eliminate reader confusion and to
guarantee predictable behavior.
有人可以通过一些代码示例阐明这种不可预测的行为意味着什么吗?
在该语言的旧版本中,parseInt()
会使函数遵循正常的 JavaScript 数字常量语法规则,包括识别前导零表示八进制常量,以及前导零0x 表示十六进制常量。因此,如果您的代码没有明确坚持以 10 为基数,带有前导零的杂散(可能是用户提供的)数字将被解释为以 8 为基数的值,而前导 0x 为十六进制。
从 ES5.1 开始,8 进制行为就消失了(我想;可能更早),但是 16 进制行为仍然存在。 (作为意外前缀,前导 0x 可能比简单的前导 0 更罕见。)
我在 Stack Overflow 上查看代码的经验是 parseInt()
无论如何都被过度使用了。使用一元运算符 +
将字符串(通常是从 DOM 元素 .value
属性中获取的字符串)转换为数字 通常 更干净:
var count = +document.getElementById("count").value;
当然,这不一定会给你一个整数。然而,它 将 做的是注意到输入字符串有尾随的非数字垃圾。 parseInt()
函数将简单地停止解析像“123abc”这样的字符串,并为您提供 123
作为数值。然而,领先的 +
会给你一个 NaN
.
如果您需要整数,您可以随时使用 Math.floor()
或 Math.round()
。
edit — 一条评论指出,ES2015 要求在 "strict" 模式中为八进制文字提供前导 0o
或 0O
,但这并不't apply to parseInt()
which (in ES2015) only override the default radix for hex strings.
由于某些他们自己最清楚的原因,指定此函数行为的人将基数设置为可默认参数,但随后决定将默认值留给实现! (也许坚持 10 的值是明智的,但也许这会扰乱 1970 年代仍然认为八进制文字有用的民间编程。)
所以为了健壮的编程,你需要自己提供基数参数。
在不提供基数的情况下,parseInt
会尝试根据您传入的值来确定正确的基数是什么,例如,如果值以 0x
开头,则它确定您必须以十六进制传递值。 0
(八进制)也是如此。
当您的输入被零填充但未提供基数时,这就会出现问题。结果(可能)与预期不同的地方
console.log(parseInt(015))
我一直在Javascript中使用parseInt()
函数而不传递radix参数。根据 MDN 文档 here,声明不提供此参数可能会导致不可预测的行为。
Always specify this parameter to eliminate reader confusion and to guarantee predictable behavior.
有人可以通过一些代码示例阐明这种不可预测的行为意味着什么吗?
在该语言的旧版本中,parseInt()
会使函数遵循正常的 JavaScript 数字常量语法规则,包括识别前导零表示八进制常量,以及前导零0x 表示十六进制常量。因此,如果您的代码没有明确坚持以 10 为基数,带有前导零的杂散(可能是用户提供的)数字将被解释为以 8 为基数的值,而前导 0x 为十六进制。
从 ES5.1 开始,8 进制行为就消失了(我想;可能更早),但是 16 进制行为仍然存在。 (作为意外前缀,前导 0x 可能比简单的前导 0 更罕见。)
我在 Stack Overflow 上查看代码的经验是 parseInt()
无论如何都被过度使用了。使用一元运算符 +
将字符串(通常是从 DOM 元素 .value
属性中获取的字符串)转换为数字 通常 更干净:
var count = +document.getElementById("count").value;
当然,这不一定会给你一个整数。然而,它 将 做的是注意到输入字符串有尾随的非数字垃圾。 parseInt()
函数将简单地停止解析像“123abc”这样的字符串,并为您提供 123
作为数值。然而,领先的 +
会给你一个 NaN
.
如果您需要整数,您可以随时使用 Math.floor()
或 Math.round()
。
edit — 一条评论指出,ES2015 要求在 "strict" 模式中为八进制文字提供前导 0o
或 0O
,但这并不't apply to parseInt()
which (in ES2015) only override the default radix for hex strings.
由于某些他们自己最清楚的原因,指定此函数行为的人将基数设置为可默认参数,但随后决定将默认值留给实现! (也许坚持 10 的值是明智的,但也许这会扰乱 1970 年代仍然认为八进制文字有用的民间编程。)
所以为了健壮的编程,你需要自己提供基数参数。
在不提供基数的情况下,parseInt
会尝试根据您传入的值来确定正确的基数是什么,例如,如果值以 0x
开头,则它确定您必须以十六进制传递值。 0
(八进制)也是如此。
当您的输入被零填充但未提供基数时,这就会出现问题。结果(可能)与预期不同的地方
console.log(parseInt(015))