前端面试题:柯里化函数总结

什么是柯里化函数

柯里化(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后执行
经验分享 程序员 微信小程序 职场和发展