18-02-24 08:57:43
Когда объект используется в контексте, где ожидается примитивное значение, например, с оператором сложения (+), JavaScript внутренне вызывает абстрактную операцию ToPrimitive для объекта. ToPrimitive пытается преобразовать объект в примитивное значение на основе указанного hint (либо "number", либо "string").
По умолчанию, когда ToPrimitive вызывается без указания hint, JavaScript пытается преобразовать объект в примитивное значение, следуя этим шагам:
Пример:
const obj = {
valueOf() {
return 42;
},
toString() {
return 'Hello';
}
};
console.log(obj + 10); // Вывод: 52
В этом примере, когда obj используется в операции сложения, JavaScript вызывает valueOf и toString для преобразования obj в примитивное значение. Поскольку valueOf возвращает число, операция сложения успешно выполняется и возвращает результат 52.
Разработчики могут контролировать способ преобразования объектов в примитивы, реализуя метод Symbol.toPrimitive. Этот метод позволяет объектам определить свое собственное пользовательское поведение преобразования на основе предоставленного hint. Если метод присутствует, JavaScript вызывает его с hint и ожидает примитивное значение в ответ.
const obj = {
[Symbol.toPrimitive](hint) {
if (hint === 'number') {
return 42;
}
if (hint === 'string') {
return 'Hello';
}
return null;
}
};
console.log(obj + 10); // Вывод: 52
console.log(obj.toString()); // Вывод: Hello
В этом примере obj определяет метод Symbol.toPrimitive, который контролирует, как он преобразуется в примитивные значения. В зависимости от предоставленного hint он возвращает различные примитивные значения.