Javascript 0 в начале числа

Я просто хочу понять логику js с 0-s в начале числа. Например

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 на числовом литерале указывает, что восьмеричное целое число является намерением,если на второй цифра 8 или 9. В таком случае ведущий 0 игнорируется.

потому что восьмеричные числовые литералы должны быть целыми, 02.5 является ошибочным.

это поведение было зарегистрировано как ошибка в Firefox в 2014 году, но потому, что в мире так много кода JavaScript, и так много его (вероятно, непреднамеренно) полагается on 09.3 не будучи синтаксической ошибкой, ошибка была отмечена как "WONTFIX".

как отметил в комментарии ниже, в "строгом" режиме восьмеричные константы полностью запрещены.


начальный ноль указывает восьмеричное число (основание 8) (в отличие от десятичного числа 10).

ведущий 0x указывает шестнадцатеричное число, а ведущий 0b-двоичное число.

поэтому 09.3 по умолчанию имеет значение decimal, потому что цифра " 9 " не существует в восьмеричной нотации.

Edit (credit Evan Trimboli, ниже): 02.5 выдает исключение, потому что восьмеричные литералы должны быть целыми числами.


уже поздно для ответа, но все-таки обновление с моей стороны. По словам 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
}

даже если мы добавим вторую цифру как 8 или 9 ведущий 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
}

также это не имело никакого смысла, потому что ведущие нули-это те же значения без ведущих ноли. Но нужно быть внимательным при получении ценностей с другой стороны.