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() у своего объекта."[object Object]": либо toString, либо JSON.stringify.