我有以下添加功能,最初显示为here。
add
只需要一个参数,但它可以通过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;
结构的同时)?
答案 0 :(得分:1)
我认为你试图避免编号的强制与add()函数无关,它是' +' Javascript的运算符有效。因此,改变这种行为并不容易。任务。它可能需要改变javascript解析器的工作方式。
我能想到的最简单的解决方法(当然不确定你是如何使用这个函数)总是用额外的add()调用来包装结果,例如:
add(2)(3) + 8; // 13, number
可以像这样包裹:
add( add(2)(3) + 8 ); // function with valueOf = 13
同样,不确定您的确切用例。