#javascript
Здравствуйте. Изучаю 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
Ответы
Ответ 1
почему в примере ниже числа складываются как строки Потому, что методы valueOf в обоих случаях возвращают строки, а если хотя бы один из операндов оператора + строка, то и второй операнд так же будет приведен к строке. Заменив возвращаемое значение на число, результат станет ожидаемым. var a = { valueOf: function() { return 1; } }; var b = { valueOf: function() { return 2; } }; console.log(a + b); Если копнуть чуть глубже, можно найти в спецификации алгоритм для оператора + В котором можно отметить шаги 5,6,7, в которых объекты приводятся к примитивам, и если хотя бы один из объектов был приведен к строке, то дальше происходит сложение строк. lprim <= ToPrimitive(lval). rprim <= ToPrimitive(rval). Если Type(lprim) или Type(rprim) - это строка, то lstr <= ToString(lprim). rstr <= ToString(rprim). Вернуть строку, которая является результатом конкатенации строк lstr и rstr. Подробнее про ToPrimitive можно посмотреть в ответе на вопрос В чем разница между valueOf и toString
Комментариев нет:
Отправить комментарий