什么是柯里化函数
柯里化(Currying): 是把一个接收多个参数的函数变换成接收一个单一参数(最初函数的第一个参数)的函数,并且返回接收余下的参数且返回结果的新函数。
题目
如一个典型的面试题:实现add(1)(2)(3)
普通函数:
function add(a,b,c) {
return a + b + c
}
console.log(add(1,2,3)) //6复制代码
柯里化函数(最简单的一种)
function add(a){
return function(b) {
return function(c) {
return a + b + c
}
}
}
console.log(add(1)(2)(3))//6复制代码
进阶
function add(){
//定义一个数组用来存储所有的参数
var params = [].slice.call(arguments);
var _add = function() {
//利用闭包的特性保存_params并收集所有的参数值
var _params = [].slice.call(arguments);
return add.apply(null,params.concat(_params));
}
//利用隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
_add.toString = function () {
return params.reduce((a,b) => {
return a + b;
})
}
return _add;
}
console.log(add(1)(2)(3)) //ƒ 6
console.log(add(1,2)(3)) //ƒ 6复制代码
疑点: Object.prototype.toString() 函数的隐式转换
为什么上面输出的是 ƒ 6,而不是6?
看下面案例:
1)
function add() {
return 20
}
console.log(add + 10)复制代码
输出
2)
function add() {
return 20
}
add.toString = function() {
return 10
}
console.log(add + 10)复制代码
输出
3)
function add() {
return 20
}
add.valueOf = function() {
return 5
}
add.toString = function() {
return 10
}
console.log(add + 10)复制代码
输出
总结:当我们没有重新定义toString与valueOf时,函数的隐式转换会调用默认的toString方法,它会将函数的定义内容作为字符串返回。而当我们主动定义了toString/vauleOf方法时,那么隐式转换的返回结果则由我们自己控制了。其中valueOf会比toString后执行