Почему ошибка 00.0 вызывает синтаксическую ошибку?

Это странно. Это то, что происходит на консоли JavaScript в Chrome (версия 42.0.2311.135, 64-разрядная версия).

> 0
< 0
> 00
< 0
> 0.0
< 0
> 00.0
X Uncaught > SyntaxError: Unexpected number

Firefox 37.0.2 делает то же самое, хотя его сообщение об ошибке:

SyntaxError: missing ; before statement

Вероятно, есть некоторые технические объяснения относительно того, как JavaScript анализирует числа, и, возможно, это может произойти только при манипулировании консольным приглашением, но все равно кажется неправильным.

Почему он это делает?

Ответ 1

Выражения 0.0 и 00.0 анализируются по-разному.

  • 0.0 анализируется как числовой литерал 1
  • 00.0 анализируется как:
    • 00 - восьмеричный числовой литерал 2
    • . - свойство accessor
    • 0 - имя идентификатора

Ваш код выдает синтаксическую ошибку, потому что 0 не является допустимым идентификатором JavaScript. Следующий пример работает, поскольку toString является допустимым идентификатором:

00.toString

1Раздел 7.8.3 - Ведущему 0 может следовать десятичный разделитель или ExponentPart
2Раздел B.1.1 - Ведущий 0 может сопровождаться OctalDigits

Ответ 2

00 оценивается как восьмеричное число, а .0 оценивается как доступ к этому свойству number. Но так как целые числа не могут использоваться в качестве атрибутов свойств, ошибка возникает.

Вы получаете ту же ошибку для любого другого объекта:

'string'.0 // Syntax error: unexpected number
({}).0 // Syntax error: unexpected number

Вы можете найти соответствующую информацию об аксессуарах свойств на MDN.