chst365's blog chst365's blog
首页
  • Git
  • 网络
  • 操作系统
  • 浏览器
  • webpack
  • JavaScript
  • TypeScript
  • 性能
  • 工程化
  • React
  • 编程题
  • React技术揭秘
  • 算法
  • Node
  • 编码解码
  • NodeJS系列
  • Linux系列
  • JavaScript系列
  • HTTP系列
  • GIT系列
  • ES6系列
  • 设计模式系列
  • CSS系列
  • 小程序系列
  • 数据结构与算法系列
  • React系列
  • Vue3系列
  • Vue系列
  • TypeScript系列
  • Webpack系列
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

chst365

DIV工程师
首页
  • Git
  • 网络
  • 操作系统
  • 浏览器
  • webpack
  • JavaScript
  • TypeScript
  • 性能
  • 工程化
  • React
  • 编程题
  • React技术揭秘
  • 算法
  • Node
  • 编码解码
  • NodeJS系列
  • Linux系列
  • JavaScript系列
  • HTTP系列
  • GIT系列
  • ES6系列
  • 设计模式系列
  • CSS系列
  • 小程序系列
  • 数据结构与算法系列
  • React系列
  • Vue3系列
  • Vue系列
  • TypeScript系列
  • Webpack系列
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 浏览器

  • webpack

  • TypeScript

  • 性能

  • 工程化

  • React

  • JavaScript

  • 编程题

    • 实现一个trim方法
    • 实现一个deepClone方法
    • 实现add(1)(2)(3)
      • 函数柯里化
        • 实现add(1)(2)(3)
    • 大数相加
    • 拍平数组flat
    • 实现防抖、节流函数
    • 反转字符串
    • 数组去重
    • 实现千位分隔符
    • 回文数
    • 实现一个模板引擎
    • 判断一个数是否是素数
    • 获取n以内所有的素数
  • React技术揭秘

  • 算法

  • 前端
  • 编程题
chst365
2022-09-01
目录

实现add(1)(2)(3)

# 函数柯里化

函数式编程里面的概念。指传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。 简单来说:每次调用函数时,它只接受一部分参数,并返回一个函数,直到传递所有参数为止。 作用:参数复用、提前返回和延时执行

# 实现add(1)(2)(3)

const add = x => y => z => x + y + z
1

看起来并不难,但是实现一个add函数,同时支持下面这几种用法呢

add(1, 2, 3)
add(1, 2)(3)
add(1)(2, 3)
1
2
3

这里我们要自己实现一个工具函数专门生成柯里化函数。 主要思路:判断当前传入函数参数的个数是否大于等于原函数所需参数个数,如果是,则执行当前函数,若小于,则返回一个函数

const curry = (fn, ...args) => 
    // 函数的参数个数可以直接通过函数数的.length属性来访问
    args.length >= fn.length // 这个判断很关键!!!
    // 传入的参数大于等于原始函数fn的参数个数,则直接执行该函数
    ? fn(...args)
    /**
     * 传入的参数小于原始函数fn的参数个数时
     * 则继续对当前函数进行柯里化,返回一个接受所有参数(当前参数和剩余参数) 的函数
    */
    : (..._args) => curry(fn, ..._args, ...args);

function add1(x, y, z) {
    return x + y + z;
}
const add = curry(add1);
console.log(add(1, 2, 3));
console.log(add(1)(2)(3));
console.log(add(1, 2)(3));
console.log(add(1)(2, 3));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

那么,无限层级版呢?

add(1)(2)(3)...(n)
1
function argsSum(args) {
  return args.reduce((pre, cur) => {
    return pre + cur
  })
}
function add(...args1) {
  let sum1 = argsSum(args1)
  let fn = function (...args2) {
    let sum2 = argsSum(args2)
    return add(sum1 + sum2)
  }
  fn.toString = function () {
    return sum1
  }
  return fn
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#前端#编程题
上次更新: 2022/09/02, 17:10:06
实现一个deepClone方法
大数相加

← 实现一个deepClone方法 大数相加→

最近更新
01
面试官
03-27
02
this&指针&作用域&闭包
03-27
03
前端
03-27
更多文章>
Theme by Vdoing | Copyright © 2019-2025 chst365 | 豫ICP备17031889号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式