一个 JavaScript 柯里化问题

起因是在群里有人问了一道题:

实现如下功能:var a = add(2)(3)(4); // 9

后来有人给出了三个字答案----“柯里化” 维基百科中解释为:

在计算机科学中,柯里化(英语:Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

上述问题的一种实现方式如下:

1
2
3
4
5
6
7
8
9
10
11
let add = x => {
let sum = x
let tem = y => {
sum += y
return tem
}
tem.toString = tem.valueOf = () => sum
return tem
}

那么为什么需要复写toStringvalueOf呢?

在权威指南中是这样解释两种方法的:

toString()方法的作用是返回一个可以表示这个对象的字符串。在希望使用字符串的地方用到对象的话,JavaScript会自动调用这个方法,如果没实现这个方法,类会默认从Object.prototype中继承toString()方法,这个方法的结果是[object object]
valueOf()用来将对象转换为原始值。比如,当数学运算符(除了“+”运算符)和关系运算符作用域数字文本表示的对象时,会自动调用valueOf()方法。

未定义的toStringvalueOf方法,返回的是tem声明的函数,而我们需要把对象转换成原始类型的值(数值、字符串和布尔值),因此需要重写两个方法使它返回需要的值。