Каковы правила для вызова функций на числовых литералах в JS? [Дубликат]

This question already has an answer here:

Why can't I access a property of an integer with a single dot? 4 answers

Поскольку я начал работать с JS, я думал, что единственный способ вызвать функцию для числового литерала - это поместить ее в положение выражения, заключив ее в скобки, например, так:

<code>1.toString();
// SyntaxError: identifier starts immediately after numeric literal

(1).toString();
// "1"
</code>

Сегодня мне пришло в голову попробовать это:

<code>0.1.toString();
// "0.1"
</code>

Почему это работает? Указатель на официальную спецификацию был бы великолепен.

Edit Неоднозначность была моей первой мыслью, но потом решил, что нет никакой двусмысленности в1.toString() или. Это глубже, чем я думал, но я все еще думаю, что я прав. Вот почему:

Property names can begin with digits

<code>var obj = { "1" : 1, "2" : 2 };
</code>

Property names that begin with digits can only be referenced with square brackets

<code>obj.1;
// SyntaxError: Unexpected token ILLEGAL
obj['1'];
// 1
</code>

Также:

<code>1['toString']();
// '1'
</code>

Следовательно,1. после любого нецифрового всегда будет вызов метода или доступ к свойству, а не десятичное число. Точно так же,1. после любой цифры всегда будет десятичное число, а не вызов метода или доступ к свойству.

 mwcz03 мая 2016 г., 19:39
Я не согласен с маркировкой этого дубликата. Вопрос содержит больше контекста, а выбранный ответ более высокого качества (включая ссылку на реальную спецификацию JavaScript, где определяется это поведение).
 zzzzBov02 мая 2012 г., 18:29
как примечание, вы могли бы использовать1..toString(), первый. обозначает десятичную точку, вторая указывает на использование для функции.
 mwcz02 мая 2012 г., 18:37
Clever, спасибо zzzzBov и CMS.
 CMS02 мая 2012 г., 18:32
 Pointy02 мая 2012 г., 18:54
Ну, естьмаленьки Неопределенность вокруг «е» - это начало показателя или первая буква идентификатора? Рассмотреть возможность1.e10(); - токенизаторам не нравится «резервное копирование»: -)

Ответы на вопрос(1)

Решение Вопроса

. в0.1, затем последующий. не могу быть частью номера.

Все дело в двусмысленности.

редактироват - раздел 7.8.3 спецификации явно настаивает на этом:

Исходный символ, следующий сразу за NumericLiteral, не должен быть IdentifierStart или ДесятичнаяЦифра.

Я не совсем уверен, что именно он пытается предотвратить, но лексер JavaScript довольно груб, в основном благодаря литеральной грамматике regex и необходимости странного хакера parser-lexer, чтобы справиться с этим.

 mwcz02 мая 2012 г., 18:38
Я не думаю, что здесь есть какая-то двусмысленность. Обновление моего вопроса с обоснованием. Меня смущает это предложение из спецификации ...0.1.toString() действителен, но выглядит для меня как NumericLiteral, за которым сразу следует десятичная цифра.
 mwcz02 мая 2012 г., 18:44
Ах, спасибо. Я посмотрел на. и не мог отличить его от. :) Я добавил аргументацию против двусмысленности, хотя, полагаю, вы пришли к этому независимо.
 Pointy02 мая 2012 г., 18:39
@ mwcz Да, я согласен, что неточевидны неоднозначность, но может быть некоторая неясная причина для настойчивости, чтобы дело рассматривалось как ошибка. Спецификация не вписывается в реальные детали. А также0.1.toString являетсян числовой литерал, за которым следует десятичная цифра: это числовой литерал, за которым следует.имвол @, который не является ни десятичной цифрой, ни идентификатором начала.

Ваш ответ на вопрос