为什么JavaScript如果数字以前导零开头,则将其视为八进制
var x = 010;
console.log(x); //8
JS引擎将数字转换x
为八进制数字。为什么会这样呢?我该如何预防?
回答:
问题在于十进制整数文字不能包含前导零:
DecimalIntegerLiteral :: 0
NonZeroDigit DecimalDigits(opt)
但是,ECMAScript 3允许(作为可选扩展)解析以8为底的前导零的文字:
OctalIntegerLiteral :: 0 OctalDigit
OctalIntegerLiteral OctalDigit
但是ECMAScript 5禁止以严格模式执行此操作:
一致性实现,在处理时严格模式代码(见10.1.1) ,必须不延伸的语法 NumericLiteral 包括_OctalIntegerLiteral_ 如描述B.1.1。
ECMAScript 6引入了 BinaryIntegerLiteral 和 OctalIntegerLiteral,所以现在我们有了更多连贯的文字:
- BinaryIntegerLiteral ,以
0b
或 开头0B
。 - OctalIntegerLiteral ,以
0o
或 开头0O
。 - HexIntegerLiteral ,以
0x
或 开头0X
。
旧的 OctalIntegerLiteral 扩展名已重命名为 LegacyOctalIntegerLiteral ,但仍可以在非严格模式下使用。
因此,如果要解析以8为底的数字,请使用0o
或0O
前缀(旧浏览器不支持)或使用parseInt
。
而且,如果您想确保自己的数字将以10为底进行解析,请删除前导零或使用parseInt
。
010
- 在严格模式下(需要ECMAScript 5),它会抛出。
- 在非严格模式下,它可能会抛出或返回
8
(取决于实现)。
0o10
,0O10
- 在ECMAScript 6之前,它们会抛出。
- 在ECMAScript 6中,它们返回
8
。
parseInt('010', 8)
- 它返回
8
。
- 它返回
parseInt('010', 10)
- 它返回
10
。
- 它返回
以上是 为什么JavaScript如果数字以前导零开头,则将其视为八进制 的全部内容, 来源链接: utcz.com/qa/429405.html