函数柯里化
函数柯里化
含义:
可以大概理解为: 将fn(a,b,c)转换为fn(a)(b)(c)
原函数:
function sum(a,b){ return a+b } console.log(sum(1,2))
柯里化后:
function sum(a) { return function (b) { return a + b } } console.log(sum(1)(2));
.
.
.
面试题
函数sum实现, 接收参数为5个时即实现累加, 满足以下几个要求:
sum(1)(2)(3)(4)(5) //输出15
sum(1)(2,3)(4)(5) //也输出15
sum(1)(2,3,4)(5) //也输出15
sum(1)(2,3)(4,5) //也输出15
.
思路: 保存不定长的参数, 如果数组长度达到5即实现累加, 否则返回函数
使用slice(数组下标前闭后开)
截取并浅拷贝返回一个新数组
使用reduce((累加器, 当前值)=>累加器+当前值, 初始值)
实现数组累加
let nums = [] function sum(...args) { nums.push(...args) if (nums.length >= 5) { // 仅累加前5个 const res = nums.slice(0, 5).reduce((p, v) => p + v, 0) nums = [] return res } else { return sum } }
.
.
调优: 参数累加的个数可以进行自定义, 这里使用了闭包
function sumCounter(count) { let nums = [] function sum(...args) { nums.push(...args) if (nums.length >= count) { const res = nums.slice(0, count).reduce((p, v) => p + v, 0) nums = [] return res } else { return sum } } return sum }
.
.
实际应用
参数复用: 为函数预制通用的参数, 供多次重复调用
// // 有如下4个函数 // function isUndefined(thing) { // return typeof thing === 'undefined' // } // function isNumber(thing) { // return typeof thing === 'number' // } // function isString(thing) { // return typeof thing === 'string' // } // function isFunction(thing) { // return typeof thing === 'function' // } // 改为通过 typeOfTest 生成: const typeOfTest = function (type) { // 1. 复用类型判断函数逻辑 // 2. 动态传入判断的类型 function isUndefined(thing) { return typeof thing === type } return isUndefined } const isUndefined = typeOfTest('undefined') const isNumber = typeOfTest('number') const isString = typeOfTest('string') const isFunction = typeOfTest('function') // 可以通过 isUndefined,isNumber,isString,isFunction 来判断类型: isUndefined(undefined) // true isNumber('123') // false isString('memeda') // true isFunction(() => { }) // true
可以简化修改为:
const typeOfTest = type => thing => typeof thing === type
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器