Почему работает 10..toString(), но 10.toString() не работает?

Возможный дубликат:
Использование toString в JavaScript

152..toString(2)

правильно создает двоичную строку "10011000", но

152.toString(2)

генерирует исключение

"SyntaxError: идентификатор начинается сразу после числового литерала

Почему? Последний синтаксис на самом деле звучит более корректно, в то время как первый выглядит очень странно!

Ответ 1

A . после того, как число может показаться неоднозначным. Является ли он десятичным или оператор-член объекта?

Однако интерпретатор решает, что он десятичный, поэтому вам не нужен оператор-член.

Он видит это как:

(10.)toString();  // invalid syntax

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

(10.).toString();

@pedants и downvoters

Символ . представляет двусмысленность. Его можно понимать как оператор-член, или десятичный знак, в зависимости от его размещения. Если бы не было никакой двусмысленности, не было бы вопроса спросить.

Интерпретация спецификации символа . в этой конкретной позиции состоит в том, что она будет десятичной. Это определяется синтаксисом числового литерала ECMAScript.

Просто потому, что спецификация устраняет двусмысленность для интерпретатора JS, не означает, что двусмысленность символа . вообще не существует.

Ответ 2

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

<152.> - легальный токен (трейлинг 0 не требуется), но <152..> нет, поэтому ваш первый пример сводится к этой серии токенов:

<152.> <.> <toString> <(> <2> <)>

которая является законной (и ожидаемой) последовательностью, тогда как вторая выглядит как

<152.> <toString> <(> <2> <)>

который является незаконным - нет маркера периода, отделяющего номер от вызова toString.

Ответ 3

10. является float number an, вы можете использовать toString на float

например.

parseFloat("10").toString() // "10"