2015-05-21 4 views
73

Это странно. Именно это происходит на консоли JavaScript в Chrome (версия 42.0.2311.135, 64-разрядная версия).Почему ошибка 00.0 вызывает синтаксическую ошибку?

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

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

SyntaxError: missing ; before statement 

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

Почему это так?

+13

И здесь я думал, что видел все * WTFs языка ... И я пути наслаждаются моментами позже. –

+2

Это не проблема, которая возникает только в консоли, 'var i = 00.0;' всегда будет вызывать SytaxError. – pstenstrm

+3

AFAIK в JS float literal должен содержать ** десятичное целое число **. Ведущие нули указывают _octal_ integer ([ref.] (Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Integers)) – hindmost

ответ

77

Выражения 0.0 и 00.0 разобраны по-разному.

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

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

00.toString 

Section 7.8.3 - ведущий 0 может сопровождаться десятичного разделителя или ЭкспоненциальнойЧасти
Section B.1.1 - ведущий 0 может быть с последующим OctalDigits

+18

Обратите внимание, что с 00.0 по 07.0 возникает исключение, однако 08.0 и 09.0 являются абсолютно допустимыми из-за того, что движок не распознает их как восьмеричные, поэтому вместо этого они анализируют десятичные числа. –

+0

@ChadSchouggins Любопытно, что цифр 8 и 9 достаточно, чтобы сказать парсеру, что это десятичное, а не восьмеричное число, тогда как точка _decimal_ не является. Это то, что происходит от перегрузки ». Я полагаю. Я бы по-разному реализовал парсер ... (я был достаточно ярким, чтобы реализовать парсер вообще). –

22

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

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

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

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

+7

В последней спецификации восьмеричный литерал начинается с '0o'. Однако из-за обратной совместимости старый синтаксис вряд ли будет удален из реализации браузера. – Leo

+0

Хорошо. Если вы найдете некоторые документы об этом, не стесняйтесь редактировать ответ, чтобы включить эту информацию и ссылку - это может быть полезно для будущих читателей! –

+0

Возможно, вы должны удалить неправильную часть или, возможно, лучше изменить/переписать ее правильно ... и переписать в отличие от добавления (т. Е. Не иметь отдельный блок «Редактировать» сверху/снизу, но вместо этого переписывать ответ для бесшовной интеграции недавно добавленной информации), как правило, лучше с точки зрения долгосрочной ценности. – Dukeling

Смежные вопросы