Проводя некоторые тесты наткнулся на интересное поведение, которое не могу себе объяснить.
Код:
var a = {
toString: function(){return "It's a string"},
valueOf: function(){return 100}
};
console.log(a); /// Выводит объект (1)
console.log(+a); /// Выводит 100 в числовом типе (2)
console.log(""+a); /// Выводит "100" в строковом типе (3)
console.log(String(a)); /// Выводит "It's a string" (4)
А теперь по порядку:
- Под (1) все понятно - должно вывести объект т.к console.log это и делает если ей дают объект.
- Под (2) cудя по преобразованию типов должно быть числовое преобразование и поэтому должен использоваться valueOf.
- Под (3) судя по преобразованию типов должно быть строковое преобразование и поэтому должно использоваться toString, но используется valueOf. Почему?
- Под (4) используется конструктор для преобразования объекта и поэтому срабатывает toString.
Вопросы:
Что не так с пунктом 3? Какие ньюансы возникают, что интерпретатор так работает?
P.S Если я где-то не прав, поправьте.
valueOf, тоесть в пункте 3 сначала привели к примитиву, получили100, а так как сложение идет со строкой, 100 привели к строке и сложили. – Rostyslav Kuzmovych Aug 20 '17 at 14:39valueOf- тогда в 4 примере мы получили бы "100". – Aug 20 '17 at 15:23+, по ссылке на спецификацию можешь проследить что и как вызывается – Grundy Aug 20 '17 at 17:08ToPrimitive, который без дополнительных параметров приводит кnumber, отсюда для второго параметра, который в данном случае переменнаяa- будет вызванvalueOf– Grundy Aug 20 '17 at 17:11+это особый случай, и я не понимаю это же прямое преобразование к строке, но методом это игнорируется. Я почитал все что вы скинули, ту спецификацию мне не осилить слишком не понятна она для меня, нужно учиться их читать. – MaximPro Aug 20 '17 at 17:34