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

javascript syntax

8169 просмотра

3 ответа

3177 Репутация автора

Возможное дублирование:
использование toString в JavaScript

152..toString(2)

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

152.toString(2)

бросает исключение

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

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

Автор: Andre Meinhold Источник Размещён: 30.10.2012 11:52

Ответы (3)


0 плюса

19781 Репутация автора

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

например.

parseFloat("10").toString() // "10"
Автор: Anoop Размещён: 30.10.2012 11:55

100 плюса

38243 Репутация автора

Решение

А .после числа может показаться неоднозначным. Это десятичный оператор или оператор члена объекта?

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

Это выглядит так:

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

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

(10.).toString();

@pedants и downvoters

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

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

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

Автор: I Hate Lazy Размещён: 30.10.2012 11:55

101 плюса

284652 Репутация автора

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

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

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

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

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

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

Автор: Alnitak Размещён: 30.10.2012 11:59
Вопросы из категории :
32x32