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

什么是柯里化函数

柯里化(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后执行


转载于:https://juejin.im/post/5c9886aef265da610445fee6

你可能感兴趣的:(前端面试题:柯里化函数总结)