面试官:什么是柯里化?怎样实现柯里化?

简介: 面试官:什么是柯里化?怎样实现柯里化?

640.jpg

一、什么是函数柯里化

柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。

接下来咱们用一个经典的面试题讲解下:实现 add(1)(2)(3) 求和

第一步:接收三个参数

 function add (a, b, c) {
    return a + b + c
  }
  // add(1, 2, 3)

第二步:接收两个参数

function add (a, b) {
  return function (c) {
    return a + b + c
  }
}
// add(1,2)(3)

到这是不是有点眉头了?

第三步:每个函数都接收一个参数

function add (a) {
  return function (b) {
    return function (c) {
      return a + b + c
    }
  }
}
// add(a)(b)(c)

es6 更简单

const add1 = (a, b) => a + b
const add2 = a => b => a + b
const add3 = a => b => c => a + b + c

看到这咱们就大致明白前文的解释了,将多个参数函数变为接受一个单一参数的函数。

但是假如面试官让你用一个函数同时支持 add(1,2,3), add(1,2)(3), add(1)(2)(3)怎么办?

先补充个概念,下面要用到 --- 函数的长度是啥?

function test (a) {} 
console.log(test.length) // 1
function test (a, b) {}
console.log(test.length) // 2

由此得知  函数的长度 就是 形参个数

思路:

判断当前传入函数的参数个数 (args.length) 是否大于等于原函数所需参数个数 (fn.length) ,如果是,则执行当前函数;如果是小于,则返回一个函数。

const curry = (fn, ...args) => {
  if (args.length >= fn.length) {
      return fn(...args) // 执行当前函数
  } else {
      return (..._args) => { // 返回一个函数
       return curry(fn, ...args, ..._args)
     }
  }
}

三、有什么作用?能干啥

  • 参数复用
  • 提前返回
  • 延迟执行

总结不到位的请多多交流指出~

往期

面试官:防抖和节流的区别是啥?实现一个防抖和节流函数

面试官:怎样实现JS数组扁平化?

面试官:怎么准确判断JS的数据类型?

面试官:怎么准确判断JS的数据类型?

面试官:能写一个new 操作符吗?

相关文章
|
11月前
|
设计模式 JSON 前端开发
前端面试必看(手写Promise+js设计模式+继承+函数柯里化等)JavaScript面试全通关(1/3)
前端面试必看(手写Promise+js设计模式+继承+函数柯里化等)JavaScript面试全通关(1/3)
68 0
|
前端开发 JavaScript
【JS面试题】函数柯里化的三种方式
在面试中你是否在被问到函数柯里化而一头雾水?或是现在你是否看到函数柯里化而一脸懵逼?这到底是个什么东西?
908 0
【JS面试题】函数柯里化的三种方式
|
1月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
1月前
|
Java
【Java基础面试四】、介绍一下Java的数据类型
这篇文章介绍了Java的数据类型,包括8种基本数据类型(整数、浮点、字符、布尔)和3类引用数据类型(数组、类、接口),并提供了基本数据类型所占内存空间和数据范围的详细信息。
|
1月前
|
Java C++
【Java基础面试十七】、Java为什么是单继承,为什么不能多继承?
这篇文章讨论了Java单继承的设计原因,指出Java不支持多继承主要是为了避免方法名冲突等混淆问题,尽管Java类不能直接继承多个父类,但可以通过接口和继承链实现类似多继承的效果。
【Java基础面试十七】、Java为什么是单继承,为什么不能多继承?
|
1月前
|
Java
【Java基础面试三】、说一说你对Java访问权限的了解
这篇文章介绍了Java中的四种访问权限:private、default(无修饰符时的访问权限)、protected和public,以及它们分别在修饰成员变量/方法和类时的不同访问级别和规则。
【Java基础面试三】、说一说你对Java访问权限的了解
|
1月前
|
Java
【Java基础面试二】、个Java文件里可以有多个类吗(不含内部类)?
这篇文章讨论了Java文件中类的定义规则,指出一个Java文件可以包含多个类(不包含内部类),但其中最多只能有一个public类,且如果有public类,它的名称必须与文件名一致。
|
1月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
1月前
|
Java
【Java基础面试三十七】、说一说Java的异常机制
这篇文章介绍了Java异常机制的三个主要方面:异常处理(使用try、catch、finally语句)、抛出异常(使用throw和throws关键字)、以及异常跟踪栈(异常传播和程序终止时的栈信息输出)。
|
1月前
|
Java
【Java基础面试三十八】、请介绍Java的异常接口
这篇文章介绍了Java的异常体系结构,主要讲述了Throwable作为异常的顶层父类,以及其子类Error和Exception的区别和处理方式。