JavaScript中前导为零的数字
试试这个:JavaScript中前导为零的数字,javascript,Javascript,试试这个: var num=040; console.log(num);//32因为0前缀表示一个八进制数(基数8)。带有前导零,数字被解释为八进制,并且4*8=32TL;博士 由于前导的0,它被视为八进制(以8为基数),就像前导的0x会使它成为十六进制(以16为基数)。这有着漫长而痛苦的历史,八进制数字在现代JavaScript中已不再是如此。在使用严格模式的现代JavaScript中,“遗留”八进制格式是一个语法错误;八进制数以0o前缀写入 历史 早期(在Netscape的初始语言以及第一
var num=040;
console.log(num);//32
因为0
前缀表示一个八进制数(基数8)。带有前导零,数字被解释为八进制,并且4*8=32
TL;博士
由于前导的0
,它被视为八进制(以8为基数),就像前导的0x
会使它成为十六进制(以16为基数)。这有着漫长而痛苦的历史,八进制数字在现代JavaScript中已不再是如此。在使用严格模式的现代JavaScript中,“遗留”八进制格式是一个语法错误;八进制数以0o
前缀写入
历史
早期(在Netscape的初始语言以及第一个和第二个ECMAScript规范中),数字文本的前导0
正式表示八进制(以8为基数),正如前导0x
表示十六进制(以16为基数):
Octalintegerlateral::
0八达吉特
八面平行八面体
例如,10
、012
和0xA
都是十进制数字10的书写方式。这与其他一些类似JavaScript(C,C++,java,…)语法的语言保持一致,但是它非常混乱。
从ECMAScript3开始,八进制文字的形式被降级为可选扩展,十进制整数文字被更改,因此它们不能有前导零(除非实现包含扩展):
DecimalIntegerLiteral::
0
非零位小数位数(opt)
但禁止在严格模式下这样做:
一致性实现在处理时,不得扩展NumericLiteral的语法以包括OctalIntegerLiteral,如中所述
(ECMAScript 2015)引入了BinaryIntegerLiteral和OctalIntegerLiteral,因此现在我们有了更连贯的文字:
- BinaryIntegerLiteral,前缀为
或0b
0b
- 八进制,前缀为
或0o
0o
- HexIntegerLiteral,前缀为
或0x
0x
0o
或0o
前缀(旧浏览器不支持),或使用parseInt
如果您想确保数字以10为基数进行解析,请删除前导零,或者使用parseInt
示例
010
- 在严格模式下(需要ECMAScript 5),这是一个语法错误
- 在非严格模式下,可能是语法错误或返回
(取决于实现)8
,0o10
0o10
- 在ECMAScript 6之前,它们是语法错误
- 在ECMAScript 6中,它们返回
8
parseInt('010',8)
- 它返回
8
- 它返回
parseInt('010',10)
- 它返回
10
- 它返回
如果您感兴趣,您可以找到当前的实时规范和历史版本。可能的重复(即使它不是一个bug,只是一个陷阱)它不是bug,它是一个功能!你能接受一个答案吗?我以前接受过你的答案,现在又接受了。奇怪的是,这不是第一次。再次感谢列夫。