Почему работает 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"