写点什么

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

作者:空城机
  • 2021 年 11 月 20 日
  • 本文字数:966 字

    阅读完需:约 3 分钟

如何用JavaScript实现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); // 6console.log(t2); // 10
console.log(add(1, 2, 3)(4)()); // 10console.log(add(1)(2)(3)(4)(5)()); // 15
复制代码


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

发布于: 1 小时前阅读数: 5
用户头像

空城机

关注

曾经沧海难为水,只是当时已惘然 2021.03.22 加入

业余作者,在线水文 主要干前端的活,业余会学学python 欢迎各位关注,互相学习,互相进步

评论

发布
暂无评论
如何用JavaScript实现add(1)(2)(3)