var x = 010;
console.log(x); //8
JS 引擎将数字x
转换为八进制数。为什么会这样?我该如何防止它发生?
var x = 010;
console.log(x); //8
JS 引擎将数字x
转换为八进制数。为什么会这样?我该如何防止它发生?
我认为我的回答在这里已经回答了这个问题,但是这个问题并不完全是重复的,所以我会附上我的回答副本。
历史
问题在于十进制整数字面量不能有前导零:
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigits(opt)
OctalIntegerLiteral ::
0 OctalDigit
OctalIntegerLiteral OctalDigit
但是ECMAScript 5在严格模式下禁止这样做:
一个符合规范的实现,当处理严格模式代码(见10.1.1)时,不能扩展NumericLiteral的语法,以包括OctalIntegerLiteral,如B.1.1所述。
ECMAScript 6引入了BinaryIntegerLiteral和OctalIntegerLiteral,因此我们现在有更加连贯的文字:
0b
或0B
为前缀。0o
或0O
为前缀。0x
或0X
为前缀。旧的OctalIntegerLiteral扩展已更名为LegacyOctalIntegerLiteral,在非严格模式下仍然允许使用。
结论
因此,如果要解析8进制数字,请使用0o
或0O
前缀(旧浏览器不支持),或使用parseInt
。
如果要确保您的数字将以10进制解析,请删除前导零,或使用parseInt
。
示例
010
8
(实现相关)。0o10
, 0O10
8
。parseInt('010', 8)
8
。parseInt('010', 10)
10
。如果数字具有有效的八进制形式,JS将前导零的数字视为八进制,否则它将其视为十进制。为了避免这种情况,请不要在源代码中使用前导零。
"Original Answer"的翻译是"最初的回答"。
console.log(010, 10, +"010")
if (021 < 019) console.log('Paradox');
'use strict'
if (021 < 019) console.log('Paradox');