Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.06.2014, 20:54
Аватар для Vyus
Новичок на форуме
Отправить личное сообщение для Vyus Посмотреть профиль Найти все сообщения от Vyus
 
Регистрация: 16.06.2014
Сообщений: 2

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;
    };
Ответить с цитированием
  #2 (permalink)  
Старый 16.06.2014, 21:22
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от 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
Ответить с цитированием
  #3 (permalink)  
Старый 16.06.2014, 21:40
Аватар для Vyus
Новичок на форуме
Отправить личное сообщение для Vyus Посмотреть профиль Найти все сообщения от Vyus
 
Регистрация: 16.06.2014
Сообщений: 2

Гм. А ведь верно -- работает. Нус, мне остается только гуглить, что бы можно было понять как и когда js вызывает valueOf. Если у кого завалялась ссылка по сабжу -- прошу не жадничать и поделиться.
Ответить с цитированием
  #4 (permalink)  
Старый 16.06.2014, 22:08
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от Vyus
ссылка по сабжу
Преобразование объектов: toString и valueOf
Ответить с цитированием
  #5 (permalink)  
Старый 16.06.2014, 22:29
Профессор
Отправить личное сообщение для depp Посмотреть профиль Найти все сообщения от depp
 
Регистрация: 22.04.2014
Сообщений: 151

либо:
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));
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Flot Как передать переменную в функцию отрисовки точки на графике Ren jQuery 0 20.06.2012 14:16
не могу открыжить все чекбоксы нажатием одного nenastiy Events/DOM/Window 11 23.05.2010 17:50
Получить все инпуты по заданоой маске nws Общие вопросы Javascript 2 09.09.2009 01:46
А где все пишем Анастасия Лондонова Internet Explorer 3 06.04.2009 06:00
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37