前端经典面试题解密-add(1)(2)(3)(4) == 10到底是个啥?

简介: 前端的小伙伴在面试的时候,几乎都会遇到一道这样的面试题: add(1)(2)(3)(4)输出结果为10。在第一次看到这道面试题的时候,很多小伙伴感到了迷茫!借用王宝强在《人在囧途》中的表演:啥啥啥,这写的都是啥?下面胡哥为各位小伙伴带来这道题的揭秘。

前言


前端的小伙伴在面试的时候,几乎都会遇到一道这样的面试题: add(1)(2)(3)(4)输出结果为10。在第一次看到这道面试题的时候,很多小伙伴感到了迷茫!借用王宝强在《人在囧途》中的表演:啥啥啥,这写的都是啥?下面胡哥为各位小伙伴带来这道题的揭秘。


一、核心点-基础函数的变种-函数柯里化


我们从0开始,一点点儿的观察。add(1)(2)(3)(4)输出的值怎么成为10,很简单,大家都明白是1+2+3+4的累加。那使用基础函数是怎么实现的呢?


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


那如何add(1)(2)(3)(4)如何也输出10呢?小伙伴接下来可能会想到这样:


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


是不是很完美!


但是如果你这么回答面试官,面试官肯定会立刻怼死你,累加到100怎么办?(PS:没有说10000已经很客气了)


王老师经典语录:下面的是重点,圈起来,一定要考!!


函数柯里化概念: 柯里化(Currying)是把接受多个参数的函数转变为接受一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数的技术。


二、函数柯里化解决方案


函数柯里化有两种不同的场景,一种为函数参数个数定长的函数,另外一种为函数参数个数不定长的函数。


  1. 函数参数个数定长的柯里化解决方案


// 定长参数
function add (a, b, c, d) {
  return [
    ...arguments
  ].reduce((a, b) => a + b)
}
function currying (fn) {
  let len = fn.length
  let args = []
  return function _c (...newArgs) {
    // 合并参数
    args = [
      ...args,
      ...newArgs
    ]
    // 判断当前参数集合args的长度是否 < 目标函数fn的需求参数长度
    if (args.length < len) {
      // 继续返回函数
      return _c
    } else {
      // 返回执行结果
      return fn.apply(this, args.slice(0, len))
    }
  }
}
let addCurry = currying(add)
let total = addCurry(1)(2)(3)(4) // 同时支持addCurry(1)(2, 3)(4)该方式调用
console.log(total) // 10


  1. 函数参数个数不定长的柯里化解决方案


问题升级:那这个问题再升级一下,函数的参数个数不确定时,如何实现呢?


function add (...args) {
  return args.reduce((a, b) => a + b)
}
function currying (fn) {
  let args = []
  return function _c (...newArgs) {
    if (newArgs.length) {
      args = [
        ...args,
        ...newArgs
      ]
      return _c
    } else {
      return fn.apply(this, args)
    }
  }
}
let addCurry = currying(add)
// 注意调用方式的变化
console.log(addCurry(1)(2)(3)(4, 5)())


相关文章
|
缓存 前端开发 中间件
[go 面试] 前端请求到后端API的中间件流程解析
[go 面试] 前端请求到后端API的中间件流程解析
|
存储 JavaScript 前端开发
2022年前端js面试题
2022年前端js面试题
455 156
|
存储 XML 移动开发
前端大厂面试真题
前端大厂面试真题
|
Web App开发 前端开发 Linux
「offer来了」浅谈前端面试中开发环境常考知识点
该文章归纳了前端开发环境中常见的面试知识点,特别是围绕Git的使用进行了详细介绍,包括Git的基本概念、常用命令以及在团队协作中的最佳实践,同时还涉及了Chrome调试工具和Linux命令行的基础操作。
「offer来了」浅谈前端面试中开发环境常考知识点
|
缓存 前端开发 JavaScript
"面试通关秘籍:深度解析浏览器面试必考问题,从重绘回流到事件委托,让你一举拿下前端 Offer!"
【10月更文挑战第23天】在前端开发面试中,浏览器相关知识是必考内容。本文总结了四个常见问题:浏览器渲染机制、重绘与回流、性能优化及事件委托。通过具体示例和对比分析,帮助求职者更好地理解和准备面试。掌握这些知识点,有助于提升面试表现和实际工作能力。
243 1
|
Web App开发 JavaScript 前端开发
前端Node.js面试题
前端Node.js面试题
|
存储 JavaScript 前端开发
|
存储 前端开发 JavaScript
44 个 React 前端面试问题
【8月更文挑战第18天】
226 2
|
存储 前端开发 JavaScript
44 个 React 前端面试问题
44 个 React 前端面试问题
|
前端开发 容器
前端面试热门问题--浮动和清除浮动(CSS)
前端面试热门问题--浮动和清除浮动(CSS)

热门文章

最新文章