Почему я не могу получить доступ к свойству целого числа с одной точкой? - PullRequest
14 голосов
/ 21 февраля 2012

Если я попытаюсь написать

3.toFixed(5)

есть синтаксическая ошибка. Использование двойных точек, вставка пробела, помещение трех в скобках или использование скобок позволяет ему работать должным образом.

3..toFixed(5)
3 .toFixed(5)
(3).toFixed(5)
3["toFixed"](5)

Почему нотация с одной точкой не работает и какую из этих альтернатив я должен использовать вместо?

Ответы [ 4 ]

19 голосов
/ 21 февраля 2012

Точка является частью числа, поэтому код будет интерпретироваться так же, как:

(3.)toFixed(5)

Это, естественно, приведет к синтаксической ошибке, поскольку вы не можете сразу следовать за номером с идентификатором.

Любой метод, который удерживает период от интерпретации как части числа, будет работать. Я думаю, что самый простой способ заключить в скобки число:

(3).toFixed(5)
11 голосов
/ 21 февраля 2012

Вы не можете получить к нему доступ из-за недостатка в токенизаторе JavaScript. Javascript пытается проанализировать обозначение точки на числе как литерал с плавающей запятой, поэтому вы не можете следовать за ним со свойством или методом:

2.toString(); // raises SyntaxError

Как вы упомянули, есть несколько обходных путей, которые можно использовать для того, чтобы числовые литералы действовали как объекты. Любой из них одинаково действителен.

2..toString(); // the second point is correctly recognized
2 .toString(); // note the space left to the dot
(2).toString(); // 2 is evaluated first

Чтобы узнать больше об использовании и свойствах объекта, ознакомьтесь с Javascript Garden .

4 голосов
/ 21 февраля 2012

Это не работает, потому что JavaScript интерпретирует 3. как начало константы с плавающей точкой (например, 3.5) или целую константу с плавающей точкой (с 3. == 3.0), поэтому вы не можете следовать за ним по идентификатору (в вашем случае, свойству-имени).Он не может распознать, что вы предполагали, что 3 и . - это два отдельных токена.

Любой из ваших обходных путей выглядит хорошо для меня.

2 голосов
/ 21 февраля 2012

Это двусмысленность в грамматике Javascript. Когда синтаксический анализатор получает несколько цифр, а затем встречает точку, он может выбирать между «NumberLiteral» (например, 3.5) или «MemberExpression» (например, 3.foo). Я полагаю, что эта двусмысленность не может быть решена с помощью научных данных - следует ли 3.e2 интерпретировать как 300 или a property e2 of 3? Поэтому они добровольно решили отдать предпочтение NumberLiteral здесь, просто потому, что на самом деле спрос на такие вещи, как 3.foo.

, невелик.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...