Преобразование объектов в примитивы возвращает, неправильный результат
let user = {
name: ' Опа',
age: 100,
[Symbol.toPrimitive](hint) {
if (hint == "string") {
// Выводит {name:Опа}.
return `{name:${this.name}}`;
} else {
// Результат должен быть {age:100} аналогично {name:Опа},
return `{age:${this.age}}`;
} // но выходит ошибка. Как решить эту проблему?
}
};
alert(user);
alert(+user);
Ответы (1 шт):
Автор решения: Grundy
→ Ссылка
Согласно спецификации оператор унарный + выполняет следующие действия:
- Вычисляет значение параметра
- Вызывает внутреннюю функцию
ToNumberи возвращает ее результат.
Согласно спецификации функция ToNumber выполняет следующие действия:
- В случае примитивных типов возвращает результат согласно таблице
- В случае объекта
- Приводит объект к примитивном значению с помощью внутренней функции
ToPrimitive, передавая параметрhintравныйnumber. - Применяет себя же к полученному примитивному значению.
- Приводит объект к примитивном значению с помощью внутренней функции
Применяя данный алгоритм к коду в вопросе можно заметить, что
- для объекта определена его функция
ToPrimitive, - для
hint=numberэта функция возвращает строку - согласно таблице, возвращенная строка не является числом
- результат оператора -
NaN
Чтобы получить {age:100} в данном случае, можно воспользоваться оператором +.
При сложении со строкой, примитивное значение второго операнда так же будет приведено к строке:
let user = {
name: ' Опа',
age: 100,
[Symbol.toPrimitive](hint) {
if (hint == "string") {
// Выводит {name:Опа}.
return `{name:${this.name}}`;
} else {
// Результат должен быть {age:100} аналогично {name:Опа},
return `{age:${this.age}}`;
} // но выходит ошибка. Как решить эту проблему?
}
};
console.log('' + user);