Проверяет понимание механизма приведения типов в JavaScript через методы valueOf, toString и Symbol.toPrimitive.
Когда объект участвует в операциях, требующих примитив (например, сложение, сравнение, конкатенация), JavaScript запускает внутренний алгоритм ToPrimitive. Этот алгоритм определяет, какой метод объекта вызвать, чтобы получить примитивное значение.
Алгоритм получает подсказку, которая указывает, какой тип примитива желателен: 'number', 'string' или 'default'. Для большинства операций (например, +, ==) используется 'default', но для сравнений и арифметики — 'number', а для строковых контекстов — 'string'.
Если ни один из методов не возвращает примитив, возникает ошибка TypeError.
const obj = {
valueOf() { return 42; },
toString() { return '42'; }
};
console.log(obj + 1); // 43 (hint: default, valueOf)
console.log(String(obj)); // '42' (hint: string, toString)
console.log(obj == 42); // true (hint: default, valueOf)
// С Symbol.toPrimitive
const obj2 = {
[Symbol.toPrimitive](hint) {
return hint === 'string' ? 'строка' : 100;
}
};
console.log(obj2 + 1); // 101
console.log(String(obj2)); // 'строка'Понимание этого механизма важно при создании пользовательских объектов, которые должны корректно участвовать в арифметических операциях или сравнениях. Например, можно реализовать объект для работы с комплексными числами, где valueOf возвращает модуль, а toString — строковое представление.
Знание порядка вызова valueOf, toString и Symbol.toPrimitive помогает избежать неожиданных результатов при приведении типов и позволяет контролировать поведение объектов в различных контекстах. Используйте Symbol.toPrimitive для точного управления, если требуется особая логика.