Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ValueOf. Все точки над И. (https://javascript.ru/forum/misc/48017-valueof-vse-tochki-nad-i.html)

Vyus 16.06.2014 20:54

ValueOf. Все точки над И.
 
На одном, все нам хорошо известном ресурсе, опубликовали статью содержащую следующий фрагмент кода. Данная функция написана отнюдь не новичком, и смысл ее в том, что бы можно было сложить неограниченное количество чисел, при условии, что аргументы передаются по одному (add(5)(14)(3) и т.д.). И все бы ничего если бы не одно но -- в данном примере возвращаемым значением является функция inner. После того как функция обрабатывает последний аргумент она просто возвращает функцию. "И что же здесь интересного ?" -- спросите вы, а то что здесь функция inner.valueOf переопределена и возвращает sum в качестве результата. Данный код работает в Chrome, а вот Mozill`e данная фича не прокатывает. Как я понимаю, автор воспользовался природой valueOf, которая позволяет вызывать сей метод, когда объект следует представить как примитив. Я с этой функцией еще не работал и меня интересует мнение "старших" -- правильно ли я понял смысл valueOf? Меня так же интересует вопрос о том почему Mozilla не вызывает valueOf при возврате объекта, а возвращает сам объект и как данную сложность можно обойти.
var add = function (a) {
      var sum = a;

      var inner = function (b) {
        sum += b;
        return inner;
      };

      inner.valueOf = function () { //объект дискуссии
        return sum;
      };

      return inner;
    };

Sweet 16.06.2014 21:22

Цитата:

Сообщение от Vyus
правильно ли я понял смысл valueOf

Да, правильно. Но в Mozilla код работает:
var add = function (a) {
  var sum = a;

  var inner = function (b) {
    sum += b;
    return inner;
  };

  inner.valueOf = function () { //объект дискуссии
    return sum;
  };

  return inner;
};
    
var x = add(1)(2);

alert(x + 3); // 1 + 2 + 3 == 6

Vyus 16.06.2014 21:40

Гм. :blink: А ведь верно -- работает. :) Нус, мне остается только гуглить, что бы можно было понять как и когда js вызывает valueOf. Если у кого завалялась ссылка по сабжу -- прошу не жадничать и поделиться.

Sweet 16.06.2014 22:08

Цитата:

Сообщение от Vyus
ссылка по сабжу

Преобразование объектов: toString и valueOf

depp 16.06.2014 22:29

либо:
var add = function (a) {
      var sum = a;

      var inner = function (b) {
        sum += b;
        return inner;
      };

      inner.valueOf = function () { //объект дискуссии
        return sum;
      };

      return inner;
    };
alert(+add(1)(2)(3));


Часовой пояс GMT +3, время: 15:34.