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

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

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 操作符吗?

相关文章
|
设计模式 JSON 前端开发
前端面试必看(手写Promise+js设计模式+继承+函数柯里化等)JavaScript面试全通关(1/3)
前端面试必看(手写Promise+js设计模式+继承+函数柯里化等)JavaScript面试全通关(1/3)
73 0
|
前端开发 JavaScript
【JS面试题】函数柯里化的三种方式
在面试中你是否在被问到函数柯里化而一头雾水?或是现在你是否看到函数柯里化而一脸懵逼?这到底是个什么东西?
1039 0
【JS面试题】函数柯里化的三种方式
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
6天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
7天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
26 4
|
1月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
66 2
|
1月前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
27 0
|
3月前
|
存储 安全 Java
这些年背过的面试题——Java基础及面试题篇
本文是技术人面试系列Java基础及面试题篇,面试中关于Java基础及面试题都需要了解哪些内容?一文带你详细了解,欢迎收藏!
|
3月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
3月前
|
Java
【Java基础面试三十七】、说一说Java的异常机制
这篇文章介绍了Java异常机制的三个主要方面:异常处理(使用try、catch、finally语句)、抛出异常(使用throw和throws关键字)、以及异常跟踪栈(异常传播和程序终止时的栈信息输出)。