Вопрос проверяет понимание синтаксиса JavaScript и различий между парсером языка и механизмом автоупаковки.
5.toString() не работает, потому что JavaScript воспринимает точку как часть числового литерала. В результате парсер “ждёт” дробную часть числа, а не вызов метода. Вариант 5..toString() работает, потому что первая точка завершает число, а вторая используется для доступа к методу. После этого число временно оборачивается в объект Number, и метод успешно вызывается.
Числовой литерал — это способ записи числа прямо в коде (5, 3.14, 10).
5.toString()Сначала опишем, как это видит парсер.
Запись:
5.toString()
Парсер читает это как:
начало числа 5.
ожидание дробной части
В итоге возникает синтаксическая ошибка
5..toString() работаетЗдесь поведение другое:
Первая точка завершает число:
5.
Вторая точка — оператор доступа к свойству
Далее срабатывает автоупаковка:
создаётся временный Number
метод берётся из Number.prototype
console.log(5..toString()); // "5"
Есть несколько читаемых и безопасных вариантов:
Через скобки:
(5).toString();
Через переменную:
const n = 5;
n.toString();
Через Number:
Number(5).toString();
5..toString() — допустимо, но выглядит странно
На практике используют скобки или переменную
Важно понимать, что проблема здесь в синтаксисе, а не в отсутствии метода
5.toString() не работает из-за правил разбора числовых литералов, а 5..toString() работает, потому что явно отделяет число от оператора доступа к методу и позволяет автоупаковке выполнить свою работу.