Преобразования объектов в примитивы

18-02-24 08:57:43


Image for the Преобразования объектов в примитивы

Абстрактная Операция ToPrimitive

Когда объект используется в контексте, где ожидается примитивное значение, например, с оператором сложения (+), JavaScript внутренне вызывает абстрактную операцию ToPrimitive для объекта. ToPrimitive пытается преобразовать объект в примитивное значение на основе указанного hint (либо "number", либо "string").

Стандартное Поведение Преобразования

По умолчанию, когда ToPrimitive вызывается без указания hint, JavaScript пытается преобразовать объект в примитивное значение, следуя этим шагам:

  1. Если у объекта есть метод Symbol.toPrimitive, JavaScript вызывает этот метод с hint и ожидает примитивное значение в ответ.
  2. Если метод Symbol.toPrimitive отсутствует, JavaScript ищет методы valueOf и toString на объекте. Затем он пытается вызвать эти методы для получения примитивного значения.
  3. Если ни один из методов не возвращает примитивное значение, JavaScript генерирует ошибку TypeError.

Пример:

​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 он возвращает различные примитивные значения.