如何用JavaScript实现add(1)(2)(3)

举报
空城机 发表于 2021/10/21 11:03:39 2021/10/21
【摘要】 有一道前端经典的面试题,实现add(1)(2)(3)。 这一道题是为了考察柯里化实现累加方法,柯里化是将接受多个参数的函数变换成接受一个单一参数

add(1)(2)(3)

有一道前端经典的面试题,实现add(1)(2)(3)。

这一道题是为了实现累加方法,乍一想实现累加不是很简单的么,不过这道题目的要求是(1)(2)(3)这样子传参来实现的。

所以简单分析就能得出内部肯定是方法套方法的样式。

具体分析:

  • 传递的参数是否是恒定的

如果只是对于1、2、3这三个值,最简单的就是直接针对性编写方法:

function add(num1) {
    return function add2(num2) {
        return function add3(num3) {
            return num1 + num2 + num3;
        };
    };
}
var res = add(1)(2)(3);
console.log(res);  // 6

但是这种方式只能算是固定情形,不能做到更多的变化。

比如针对add(1)(2)(3)(4)(5)add(1, 2, 3)(4)这种类型就不能得出答案了,所以还需要进行改进。

这里可以使用柯里化的概念。

柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

具体的柯里化这里就不多做解释了,其实就是将原先的add(x, y) 变成了add(x)(y)这样只接受单一参数的形式

参考文章:

这里题目的解答:

add方法当中再设置一个_add方法和一个arr数组,此_add方法中可以进行参数判断,如果传入的参数依旧存在,那么arr数组中添加入此次的参数。否则进行参数累加计算。

// numTo累加方法
function numTo(args:number[]):number {
    let res = 0;
    args.map((item)=>{
        res += item;
    })
    return res;
}
function add(...args:number[]) {
    let arr:number[] = args;
    let _add = (...args2:number[]):any=>{   
        if (args2.length) {
            arr = arr.concat(args2);
            return _add;
        } else {
            return numTo(arr)
        }
    }
    return _add;
}

需要的计算结果:

console.log(add(1)());  // 1

let t1 = add(1)(2)(3)();
let t2 = add(1, 4)(2)(3)();
console.log(t1);  // 6
console.log(t2);  // 10

console.log(add(1, 2, 3)(4)());  // 10
console.log(add(1)(2)(3)(4)(5)());  // 15

这样,经典的柯里化面试题add(1)(2)(3)就完成了

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。