为什么JavaScript将前导零的数字视为八进制
JS引擎将数字为什么JavaScript将前导零的数字视为八进制,javascript,Javascript,JS引擎将数字x转换为八进制数字。为什么会这样?如何防止它?这是因为一些JavaScript引擎将前导零解释为八进制数文本。其定义见附录 但是,在严格模式下,一致性实现不得实现该功能-请参阅: 处理严格模式代码时的一致性实现(参见 10.1.1),不得扩展NumericLiteral的语法,以包括B.1.1中所述的OctalIntegerLiteral 由于这种模糊性,最好不要使用前导零。我想我的答案回答了这个问题,但这个问题并不完全是重复的,所以我附上了我答案的副本 历史 问题是十进制整数文本
x
转换为八进制数字。为什么会这样?如何防止它?这是因为一些JavaScript引擎将前导零解释为八进制数文本。其定义见附录
但是,在严格模式下,一致性实现不得实现该功能-请参阅:
处理严格模式代码时的一致性实现(参见
10.1.1),不得扩展NumericLiteral的语法,以包括B.1.1中所述的OctalIntegerLiteral
由于这种模糊性,最好不要使用前导零。我想我的答案回答了这个问题,但这个问题并不完全是重复的,所以我附上了我答案的副本
历史
问题是十进制整数文本不能有前导零:
DecimalIntegerLiteral::
0
非零位小数位数(opt)
但是,ECMAScript3允许(作为可选扩展)解析base8中前导零的文本:
Octalintegerlateral::
0八达吉特
八面平行八面体
但禁止在严格模式下这样做:
一致性实现在处理时,不得扩展NumericLiteral的语法以包括OctalIntegerLiteral,如中所述
介绍了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
- 它返回
if(021<019)console.log('Paradox')代码>什么是日志?@Andy-10,不是8。他在问为什么在数字前面加上0会使它假定为八进制。我不怪他问这个问题。一个以0开头的文字数字值总是被解释为八进制值。哈,是的,我没有正确地问这个问题。我知道为什么它会记录为八进制,我只是想知道10是否是OP的预期输出。如果我们用0x作为数字的前缀,那么它也会将数字转换为十六进制。这不是JS文本的语法。这是一个在严格模式下被明确禁止的非标准扩展。右:)从未注意到这一点。让我给这个问题加1分。答案已修复。“未捕获的语法错误:严格模式下不允许使用带前导零的小数。”
var x = 010;
console.log(x); //8