0

我有以下添加功能,最初出现在这里add只接受一个参数,但它可以通过柯里化和闭包的“魔术”进行“无限”次。

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前面示例中的 the 就不再是函数,而是转换为数字。

现在背景已经不碍事了,我的问题是:是否有一种(相对简单的)方法来防止add函数的类型强制,同时仍然允许它用于算术运算?或者,换句话说,是否有一种简单的方法可以直接修改valueOf(和/或a值)而不添加太多样板(最好在保持add(x)+y;结构的同时)?

4

1 回答 1

1

我认为您试图避免的强制数字与 add() 函数无关,它是 Javascript 的“+”运算符的工作方式。因此,改变这种行为并不是一件容易的事。可能需要改变 javascript 解析器的工作方式。

我能想到的最简单的解决方法(当然不确定你是如何使用这个函数的)总是用额外的 add() 调用来包装结果,例如:

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

可以这样包装:

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

同样,不确定您的确切用例。

于 2016-06-03T08:04:52.017 回答