var x = 010; console.log(x); //8
JS引擎将数字转换x为八进制数字。为什么会这样呢?我该如何预防?
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,所以现在我们有了更多连贯的文字:
0b
0B
0o
0O
0x
0X
旧的 OctalIntegerLiteral 扩展名已重命名为 LegacyOctalIntegerLiteral ,但仍可以在非严格模式下使用。
结论
因此,如果要解析以8为底的数字,请使用0o或0O前缀(旧浏览器不支持)或使用parseInt。
parseInt
而且,如果您想确保自己的数字将以10为底进行解析,请删除前导零或使用parseInt。
例子
010
8
0o10
0O10
parseInt('010', 8)
parseInt('010', 10)
10