Js, численное преобразование в объектах

263
09 мая 2017, 05:41

Здравствуйте.Изучаю Js и остановился на одном моменте не могу понять об численном преобразовании объектов. В главе пишет, что численное преобразование делается через метод valueOf, а если его нет – то toString. Тогда почему в примере ниже числа складываются как строки в a + b?

var a = {
valueOf: function() {
return "1";
}
};
var b = {
valueOf: function() {
return "2";
}
};
alert( a + b ); // "12"
alert( a - b ); // "1" - "2" = -1
Answer 1

почему в примере ниже числа складываются как строки

Очевидно потому, что методы valueOf в обоих случаях возвращают строки, а если хотя бы один из операндов оператора + строка, то и второй операнд так же будет приведен к строке.

Заменив возвращаемое значение на число, результат станет ожидаемым.

var a = { 
  valueOf: function() { 
    return 1; 
  } 
}; 
var b = { 
  valueOf: function() { 
    return 2; 
  } 
}; 
 
console.log(a + b);

Если копнуть чуть глубже, можно найти в спецификации алгоритм для оператора +

В котором можно отметить шаги 5,6,7, в которых объекты приводятся к примитивам, и если хотя бы один из объектов был приведен к строке, то дальше происходит сложение строк.

  1. lprim <= ToPrimitive(lval).
  2. rprim <= ToPrimitive(rval).
  3. Если Type(lprim) или Type(rprim) - это строка, то
    1. lstr <= ToString(lprim).
    2. rstr <= ToString(rprim).
    3. Вернуть строку, которая является результатом конкатенации строк lstr и rstr.

Подробнее про ToPrimitive можно посмотреть в ответе на вопрос В чем разница между valueOf и toString

READ ALSO
Как при нажатии на одну кнопку активировать обе?

Как при нажатии на одну кнопку активировать обе?

ЗдравствуйтеНа сайте есть два поля и две кнопки

330
Искусственный интеллект [требует правки]

Искусственный интеллект [требует правки]

Есть ли JavaScript на искусственный интеллект?

208
Запуск python скрипта со страницы на django

Запуск python скрипта со страницы на django

Есть определенная кнопка в listhtml:

793