Преобразование объектов valueOf и toString [дубликат]

333
22 августа 2017, 15:35

На данный вопрос уже ответили:

  • В чем разница между valueOf и toString 2 ответа
  • Js, численное преобразование в объектах 1 ответ

Проводя некоторые тесты наткнулся на интересное поведение, которое не могу себе объяснить.

Код:

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. Под (1) все понятно - должно вывести объект т.к console.log это и делает если ей дают объект.
  2. Под (2) cудя по преобразованию типов должно быть числовое преобразование и поэтому должен использоваться valueOf.
  3. Под (3) судя по преобразованию типов должно быть строковое преобразование и поэтому должно использоваться toString, но используется valueOf. Почему?
  4. Под (4) используется конструктор для преобразования объекта и поэтому срабатывает toString.

Вопросы:

Что не так с пунктом 3? Какие ньюансы возникают, что интерпретатор так работает?

P.S Если я где-то не прав, поправьте.

Answer 1

Вопрос о конкатенации решается уже после преобразования обоих операндов в примитивы. Т.е. сначала происходит численное преобразование объекта (т.к. + это математический оператор), а уже потом строковое (т.к. второй операнд строка).

READ ALSO
Выборка в DOM с кешированием результата

Выборка в DOM с кешированием результата

Как реализуется функция выборки элементов в DOM, с последующим кешированием? По сути задача не сложная, создать объект для сохранения результатов...

248
Проблема с width в owl carousel 2.2.1

Проблема с width в owl carousel 2.2.1

Всем доброго вечераВозникла проблема с owl carousel, при первой загрузке страницы width равен 0 и, естественно, слайдер не отображается

405
Как проверить поддержку браузером spread operator'а?

Как проверить поддержку браузером spread operator'а?

Возможно ли в JavaScript проверить, поддерживает ли браузер spread operator? Будет ли в этом браузере работать следующая конструкция?

357