Вход

Просмотр полной версии : ValueOf. Все точки над И.


Vyus
16.06.2014, 20:54
На одном, все нам хорошо известном ресурсе, опубликовали статью содержащую следующий фрагмент кода. Данная функция написана отнюдь не новичком, и смысл ее в том, что бы можно было сложить неограниченное количество чисел, при условии, что аргументы передаются по одному (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
правильно ли я понял смысл 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
ссылка по сабжу
Преобразование объектов: toString и valueOf (http://learn.javascript.ru/object-conversion)

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));