数字开头的 Javascript 0

IT技术 javascript numbers leading-zero
2021-02-13 12:28:01

我只是想了解以 0-s 开头的 js 逻辑。例如

var x = 09.3
// here x == 9.3
// other example
09.3 == 9.3
// returns true

// but check this one
var x = 02.5
// Uncaught SyntaxError: Unexpected number
// or this one
02.5 == 2.5 
// same error here

谁能解释一下它是如何工作的,为什么在第一个例子中它起作用,并忽略前导零,但在第二个例子中它给了我一个 SyntaxError

谢谢

3个回答

龙头0上的数值字面指示一个八进制整数是意图,除非所述第二位数是89在这种情况下,前导将0被忽略。

因为八进制数字文字必须是整数,02.5是错误的。

这种行为在 2014 年被记录为 Firefox 中的一个错误,但由于世界上有太多 JavaScript 代码,而且其中很多(可能是无意中)依赖于09.3不是语法错误,因此该错误被标记为“WONTFIX”。

正如在下面的评论中指出的那样,在“严格”模式下,完全不允许八进制常量。

@Barmar 嗯 MDN 暗示第二个数字很重要;我会再次检查规格。编辑看起来 MDN 是错误的(或措辞不当)。
2021-03-26 12:28:01
提及该语法在 ES5 中已弃用,因此目前无效多年,这也可能是有益的。
2021-04-01 12:28:01
不仅仅是第二个数字——如果任何数字是 8 或 9,前导 0 将被忽略。
2021-04-02 12:28:01
@Pointy 他们已被弃用 - 八进制文字的语法已从 ES5 es5.github.io/#B.1 中删除
2021-04-03 12:28:01
@zerkms 以及前导零八进制常量没有被弃用;我认为它parseInt()改变了。
2021-04-06 12:28:01

前导零表示八进制(基数 8)数字(与十进制数 - 基数 10 - 数字相反)。

前导 0x 表示十六进制数,前导 0b 表示二进制数。

因此 09.3 默认为十进制,因为八进制表示法中不存在数字“9”。

编辑(信用 Evan Trimboli,下面):02.5 抛出异常,因为八进制文字必须是整数。

09.3默认为9.3,不是0.3这是问题中的一个错字,已被编辑。
2021-03-16 12:28:01
这仍然不能解释为什么它会抛出异常,因为八进制文字必须是整数。
2021-04-13 12:28:01

这个答案已经晚了,但仍然是我这边的更新。正如 Pointy 在严格模式下所说的八进制常量是不允许的。

'use strict'
if(022 == 22){
  console.log("True");
}
console.log("Failed")

抛出异常

{
  "message": "Uncaught SyntaxError: Octal literals are not allowed in strict mode.",
  "filename": "https://stacksnippets.net/js",
  "lineno": 14,
  "colno": 4
}

即使我们将第二个数字添加为89仍然0不允许在strict mode

'use strict'
if(029 == 29){
  console.log("True");
}
console.log("Failed")

它也会抛出异常

{
  "message": "Uncaught SyntaxError: Decimals with leading zeros are not allowed in strict mode.",
  "filename": "https://stacksnippets.net/js",
  "lineno": 14,
  "colno": 4
}

也没有任何意义,因为前导零是没有前导零的相同值。但是从对方接收值时需要注意。