前端面试题:柯里化函数总结
什么是柯里化函数
柯里化(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后执行什么是柯里化函数 柯里化(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后执行
