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

5

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. после любой цифры всегда будет десятичное число, а не вызов метода или доступ к свойству.

Я не согласен с маркировкой этого дубликата. Вопрос содержит больше контекста, а выбранный ответ более высокого качества (включая ссылку на реальную спецификацию JavaScript, где определяется это поведение). mwcz
как примечание, вы могли бы использовать1..toString(), первый. обозначает десятичную точку, вторая указывает на использование для функции. zzzzBov
Связанный: Stackoverflow.com / д / 2300197 CMS
Ну, естьмаленьки Неопределенность вокруг «е» - это начало показателя или первая буква идентификатора? Рассмотреть возможность1.e10(); - токенизаторам не нравится «резервное копирование»: -) Pointy
Clever, спасибо zzzzBov и CMS. mwcz

Ваш Ответ

1   ответ
5

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

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

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

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

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

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

Похожие вопросы