2016-06-03 17 views
0

У меня есть следующая функция добавления, которая появилась первоначально here. add принимает только один аргумент, но он может делать это «бесконечное» количество раз через «магию» каррирования и закрытия.Тип Принуждение со значениемOf Математические операции

function add (a) { 
    var f = b => add(a + b); 

    f.valueOf =() => a; 

    return f; 
} 

var add4 = add(2)(2); 
var add6 = add4(2); 
var add10 = add6(2)(2); 
var add14 = add10(2)+2; 
//var add16 = add14(2); no longer works because of type conversion above. 
console.log(+add4, +add6, +add10, add14); 
//logs 4, 6, 10, 14 

Вы можете видеть выше, что функция может продолжать создавать функции с новыми a значений, которые могут пойти на принятие дополнительных аргументов. Функция также может действовать как нормальная переменная для математических операций, таких как var sum = add(x)+y;.

Однако, после преобразования типа, sum из предыдущего примера перестает быть функцией и преобразуется в число.

Теперь, когда фон не в порядке, мои вопросы таковы: существует ли (относительно простой) способ избежать принудительного применения функции add, сохраняя при этом возможность использования в арифметических операциях? Или, другими словами, существует простой способ прямого изменения значений valueOf (и/или a) без добавления большого шаблона (предпочтительно при сохранении структуры add(x)+y;)?

ответ

1

Я думаю, что принуждение к числу, которое вы пытаетесь избежать, не связано с функцией add(), это способ работы оператора «+» Javascript. Поэтому изменение этого поведения не является «легкой» задачей. Это может изменить работу JavaScript-парсера.

Самый простой обходной путь я могу думать (не уверен, конечно, как именно вы используете эту функцию), чтобы всегда обернуть результат с дополнительной надстройкой() вызова, например:

add(2)(3) + 8; // 13, number 

может быть завернутые как это:

add(add(2)(3) + 8); // function with valueOf = 13 

Опять же, не уверены в вашем конкретном случае использования.

+0

Это на самом деле неплохая идея. Я полагал, что это будет ограничено тем, как функционирует оператор '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Это кажется хорошим решением. Это более интересный вопрос, просто задающийся вопросом, можно ли это сделать, поэтому я не вложил много средств в конкретные случаи вне того, что было указано в этом примере. – Brad

+0

Рад, если бы это помогло! Что касается оператора '+', ему не кажется, что он взаимодействует (как золото с другими химикатами). Он терпеливо ждет операндов слева и справа, чтобы их оценивали, а потом только поднимается и делает то, чему его обучают, и затем исчезает. –