为什么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
