JavaScript 中前导零的数字
Posted
技术标签:
【中文标题】JavaScript 中前导零的数字【英文标题】:Number with leading zero in JavaScript 【发布时间】:2022-01-10 04:36:52 【问题描述】:试试这个:
var num = 040;
console.log(num); // 32
从什么时候开始 40 = 32?
【问题讨论】:
Workarounds for javascript parseInt octal bug 的可能重复项(尽管这不是错误,只是一个问题) 这不是错误,而是功能! 你能接受一个答案吗? 我以前接受过你的回答,现在又接受了。奇怪,这不是第一次。再次感谢 Levu。 【参考方案1】:带有前导零的数字被解释为八进制和4 * 8 = 32
。
【讨论】:
【参考方案2】:TL;DR
由于前导 0
,它被视为八进制(以 8 为底),就像前导 0x
将使其变为十六进制(以 16 为底)一样。这有着悠久而痛苦的历史,不再是现代 JavaScript 中八进制数的编写方式。在使用严格模式的现代 JavaScript 中,“遗留”八进制格式是语法错误;八进制数字以0o
前缀书写。
历史
早期(在 Netscape 的初始语言以及第一和第二个 ECMAScript 规范中),数字文字上的前导 0
正式表示 八进制(以 8 为基数),就像前导 @ 987654331@ 表示十六进制(以 16 为基数):
OctalIntegerLiteral ::
0 OctalDigit
OctalIntegerLiteral OctalDigit
例如,10
、012
和 0xA
都是十进制数的写法。这与其他一些语法类似于 JavaScript(C、C++、Java...)的语言保持一致,但它非常令人困惑。
从 ECMAScript 3 开始,这种形式的八进制字面量被降级为可选扩展名,十进制整数字面量也发生了变化,因此它们不能有前导零(除非实现包含扩展名):
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigits(opt)
但是ECMAScript 5 禁止在严格模式下这样做:
在处理 strict mode code (see 10.1.1) 时,符合规范的实现不得扩展 NumericLiteral 的语法以包含 OctalIntegerLiteral,如 B.1.1 中所述。
ECMAScript 6 (ECMAScript 2015) 引入了 BinaryIntegerLiteral 和 OctalIntegerLiteral,所以现在我们有了更多连贯的文字:
BinaryIntegerLiteral,前缀为0b
或0B
。
OctalIntegerLiteral,前缀为0o
或0O
。
HexIntegerLiteral,前缀为0x
或0X
。
旧的 OctalIntegerLiteral 扩展已重命名为 LegacyOctalIntegerLiteral,在非严格模式下仍然允许使用。
结论
因此,如果要解析以 8 为基数的数字,请使用 0o
或 0O
前缀(旧浏览器不支持),或使用 parseInt
。
如果您想确保以 10 为基数解析您的数字,请删除前导零,或使用 parseInt
。
示例
010
8
(取决于实现)。
0o10
, 0O10
在 ECMAScript 6 之前,它们是语法错误。
在 ECMAScript 6 中,它们返回 8
。
parseInt('010', 8)
它返回8
。
parseInt('010', 10)
它返回10
。
如果你有兴趣,可以找到当前生活规范here,以及历史版本here。
【讨论】:
【参考方案3】:因为0
前缀表示八进制数(基数为 8)。
【讨论】:
以上是关于JavaScript 中前导零的数字的主要内容,如果未能解决你的问题,请参考以下文章