Как происходит toString?

👨‍💻 Frontend Developer 🟠 Может встретиться 🎚️ Средний
#JavaScript #String

Краткий ответ

  • String(value) — явное преобразование к строке по правилам спецификации (ToString).
  • value.toString() — метод у объекта/примитива; у null/undefined метода нет.
  • Конкатенация ('' + value) и шаблонные строки (${value}) делают неявное преобразование к строке.

Полный ответ

Явное и неявное преобразование

  • Явное: String(value) — безопасно для любых значений, включая null и undefined.
  • Метод: value.toString() — может отсутствовать (у null/undefined) или быть переопределён.
  • Неявное: '' + value или ${value} — движок выполнит ToPrimitive, затем ToString.

Мини‑примеры:

String(123);        // "123"
(123).toString();   // "123"
'' + 123;           // "123"

Примитивы

  • Числа: String(1.2)"1.2", String(NaN)"NaN", String(Infinity)"Infinity".
  • Булевы: String(true)"true", String(false)"false".
  • null/undefined: String(null)"null", String(undefined)"undefined"; у них нет toString().

Мини‑примеры:

String(null);       // "null"
String(undefined);  // "undefined"
// null.toString()  // TypeError

Массивы и объекты

  • Массивы: [].toString()"", [1,2].toString()"1,2".
  • Обычные объекты: по умолчанию "[object Object]" (через Object.prototype.toString), если не переопределять.

Мини‑примеры:

[1, 2].toString();     // "1,2"
({}).toString();       // "[object Object]"

Переопределение toString:

const user = { name: 'Ada', toString() { return `User:${this.name}`; } };
String(user);          // "User:Ada"

Символы

  • symbol.toString()"Symbol(desc)".
  • Конкатенация '' + symbol может бросить ошибку; используйте явное String(symbol) или symbol.toString().

Мини‑пример:

const s = Symbol('x');
s.toString();          // "Symbol(x)"

Шаблонные строки и конкатенация

Обе формы приводят значение к строке:

`${true}`;            // "true"
'' + [1, 2];          // "1,2"

Частые ошибки

  • Вызывать toString у null/undefined — приведёт к ошибке.
  • Ожидать «красивый» вывод объектов по умолчанию — получите "[object Object]"; либо переопределите toString, либо используйте JSON.stringify(obj).

Мини‑пример:

JSON.stringify({ a: 1 }); // "{\"a\":1}"

Рекомендации

  • Нужна надёжность: используйте String(value).
  • Нужен контроль формата: переопределите toString() у своего объекта.
  • В UI/логах избегайте "[object Object]": либо toString, либо JSON.stringify.