golovewkin
@golovewkin
WEB - Разработчик

Почему вызывается valuOf, ведь по идее это строковое преобразование?

var foo = {
  toString: function() {
    return 'foo';
  },
  valueOf: function() {
    return 2;
  }
};

alert( foo ); // строковое преобразование, вызывается toString
alert( foo + 1 );  // численное преобразование,  вызывается valuOf
alert( foo + "3" );  // должно вызываться toString, ведь это строковое преобразование???
//Почему вызывается valuOf?

Может, преобразование идет в 2 этапа?
Сначала численное преобразование объекта, потом интерпретатор видит, что 1 из операндов строка и складывает как строки?
Спасибо
  • Вопрос задан
  • 168 просмотров
Решения вопроса 1
Смотрим спецификацию The Addition operator ( + ) (русский вариант)
Там черным и красным по белому написаны этапы вычисления такого выражения.
Перед тем, как интерпретатор решит, конкатенацию произвести или арифметическое сложение, еще есть 6 пунктов).
В вашем случае пункт 5 сработает сначала, то есть нужно преобразовать объект в простое значение.
Для преобразования объекта в примитив используется valueOf (у Date stringOf)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@teslor
В математических выражениях происходит численное преобразование. Т.е. сначала объект foo будет преобразован в число, а затем, когда уже число 2 складывается со строкой, оно будет преобразовано в строку.
Ответ написан
Комментировать
iam_not_a_robot
@iam_not_a_robot
Когда строка используется в числовом контексте, она автоматически преобразуется в число. Например, следующее выражение является вполне допустимым:
var product = "21" * "2"; //в результате получится число 42.

Т.е. foo + "3" он считает foo + 3
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы