Я разобрался вроде как с темой преобразования объектов в примитивы, но один вопрос все таки возник.
Вот код:
let test = {
key: 'aaa',
3: 3,
valueOf() {
return this[3];
},
};
console.log(String(test));
Явное преобразование при помощи String, значит прилетает хинт 'string', ищет метод toPrimitive - нет. дальше ищет метод toString - его нет. Ищет метод valueOf - он есть и он явно возвращает примитив, а не объект.
Но консоль мне выдает [object Object], почему так?
Ведь судя по книге, должен сработать valueOf
spoiler
Если нет Symbol.toPrimitive, тогда JavaScript пытается найти методы toString и valueOf:
Для хинта "string": вызвать метод toString, а если он не существует, то valueOf (таким образом, toString имеет приоритет при строковом преобразовании).
Для других хинтов: valueOf, а если он не существует, то toString (таким образом, valueOf имеет приоритет для математических операций).