使用valueOf Math Operations键入强制类

时间:2016-06-03 06:42:55

标签: javascript closures currying coercion value-of

我有以下添加功能,最初显示为hereadd只需要一个参数,但它可以通过currying和闭合的“魔法”进行“无限”次数。

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 个答案:

答案 0 :(得分:1)

我认为你试图避免编号的强制与add()函数无关,它是' +' Javascript的运算符有效。因此,改变这种行为并不容易。任务。它可能需要改变javascript解析器的工作方式。

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

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

可以像这样包裹:

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

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