JavaScript 函数柯里化

news2024/11/25 0:06:47

🎶什么是柯里化

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

🎡简单的函数柯里化的实现

     // ------------- 原函数 -------------
    function sum(a, b) {
      return a + b
    }

    sum(1, 2) // 3


    // ------------- 柯里化 -------------
    // 1. 定义接收一个参数的函数
    function sum(a) {
      // 2. 内部返回一个接收剩余参数的新函数,返回累加结果
      return function (b) {
        return a + b
      }
    }

    sum(1)(2)// 3    
    // 这里sum(1)=ƒ (b) {return a + b}


🎉柯里化相关面试题

🍧改写函数sum实现:传递5个参数实现累加

 // ------------- 原函数 -------------
	function sum(a, b, c, d, e) {
	      return a + b + c + d + e
	    }


    // ------------- 需求 -------------
    // 改写函数sum实现:参数传递到5个即可实现累加
	    sum(1)(2)(3)(4)(5)
	    sum(1)(2,3)(4)(5)
	    sum(1)(2,3,4)(5)
	    sum(1)(2,3)(4,5)

	

🍿实现


    // 1. 定义一个函数nums用来保存不定长参数
    let nums = []
    function sum (...args) {
      nums.push(...args)
      // 2. 通过nums的长度,判断参数的个数
      if (nums.length >= 5) {
        // 2.1 长度到5 累加 截取nums前五项 并对前五项进行累加 reduce是累加函数
        const res = nums.slice(0, 5).reduce((p, v) => p + v, 0)
        // 注意:累加之后需要清空数组,保证下次累加的值是正确的
        nums = []
        return res

      } else {
        // 2.2 长度没到5 返回函数接收剩余参数
        return sum
      }
    }
    // 输出
    console.log(sum(1)(2)(3)(4)(5)) // 15
    console.log(sum(1)(2, 3)(4)(5)) // 15
    console.log(sum(1)(2, 3, 4)(5)) // 15
    console.log(sum(1)(2, 3)(4, 5)) // 15

✨实现函数sumMaker:实现一个累加器,通过输入决定参数个数

 function sumMaker (length) {
      //实际上就是在外面包裹一层sunMaker函数,再把上面写死的5改成传入的length即可
      let nums = []
      function sum (...args) {
        nums.push(...args)
        if (nums.length >= length) {
          const res = nums.slice(0, length).reduce((p, v) => p + v, 0)
          nums = []
          return res
        } else {
          return sum
        }
      }
      return sum
    }

    // 调用
    const sum6 = sumMaker(6)
    console.log(sum6(1, 2, 3)(4, 5, 6)) // 21 
    const sum4 = sumMaker(4)
    console.log(sum4(1, 2)(3)(4)); // 10


🎀函数柯里化的应用

❤️别名方法

有如下4个函数, 写一个函数typeOfTest() 当用到某一个时自动生成

   // 有如下4个函数, 写一个函数typeOfTest() 当用到某一个时自动生成
    // 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 生成:
    // 2. 动态传入判断的类型
    // const typeOfTest = function (type) {
    //   // 1. 复用 类型判断函数的逻辑
    //   function isUndefined(thing) {
    //     return typeof thing === type
    //   }
    //   return isUndefined
    // }

    // 这是通过上面代码两次简化抽象成箭头函数来实现的
    const typeOfTest = type => thing => typeof thing === type




    // typeOfTest动态的生成类型判断函数,需要用哪个,动态生成即可
    const isString = typeOfTest('string')
    console.log(isString("string")) // true
    console.log(isString(111)) // false 
    const isUndefined = typeOfTest('undefined')
    console.log(isUndefined(undefined)) // true
    console.log(isUndefined(111))  //fasle





我只是一个封面图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1049498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac电脑强大的字体管理 RightFont for Mac

RightFont for Mac软件特色 速度有多快?RightFont可以在0.9秒以内加载30,000个字体! 自动从Google字体/ Adobe Typekit集合(通过Adobe Creative Cloud客户端)同步字体。 轻松切换组视图以折叠/展开字体系列。 通过简单的拖放导入…

怎么保护苹果手机移动应用程序ipa中文件安全?

目录 前言 1. 对敏感文件进行文件名称混淆 2. 更改文件的MD5值 3. 增加不可见水印处理 3. 对html,js,css等资源进行压缩 5. 删除可执行文件中的调试信息 前言 ios应用程序存储一些图片,资源,配置信息,甚至敏感数…

raw图片处理软件:DxO PhotoLab 6 mac中文版支持相机格式

DxO PhotoLab 6 mac是一款专业的RAW图片处理软件,适用于Mac操作系统。它具有先进的图像处理技术和直观易用的界面,可帮助用户轻松地将RAW格式的照片转换为高质量的JPEG或TIFF图像。 DxO PhotoLab 6支持多种相机品牌的RAW格式,包括佳能、尼康、…

多叉树+图实现简单业务流程

文章目录 场景整体架构流程业务界面技术细节小结 场景 这次遇到一个需求,大致就是任务组织成方案,方案组织成预案,预案可裁剪调整.预案关联事件等级配置,告警触发预案产生事件.然后任务执行是有先后的,也就是有流程概念. 整体架构流程 方案管理、预案管理构成任务流程的基础条…

Redis学习第九天

今天是Jedis!作者的Redis在游戏本上,但是Java的IDEA总是下载不了,所以只能作为概念听一听了,目前无法做到实操。 Jedis概念 Jedis实操 首先要保证redis的服务器开启,然后引入jedis依赖,最后通过服务器的I…

【学习笔记】深度学习分布式系统

深度学习分布式系统 前言1. 数据并行:参数服务器2. 流水线并行:GPipe3. 张量并行:Megatron LM4. 切片并行:ZeRO5. 异步分布式:PATHWAYS总结参考链接 前言 最近跟着李沐老师的视频学习了深度学习分布式系统的发展。这里…

作用域 CSS 回来了

几年前,消失的作用域 CSS,如今它回来了,而且比以前的版本要好得多。 更好的是,W3C规范基本稳定,现在Chrome中已经有一个工作原型。我们只需要社区稍微关注一下,引诱其他浏览器构建它们的实现,并…

嵌入式数据库sqlite3基本命令操作基础(05)

前言 数据在实际工作中应用非常广泛,数据库的产品也比较多,oracle、DB2、SQL2000、mySQL;基于嵌入式linux的数据库主要有SQLite, Firebird, Berkeley DB, eXtremeDB。 本文主要讲解数据库SQLite,通过这个开源的小型的嵌入式数据…

MySQL5.7高级函数:JSON_ARRAYAGG和JSON_OBJECT的使用

前置准备 DROP TABLE IF EXISTS t_user; CREATE TABLE t_user (id bigint(20) NOT NULL,name varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci …

Unity - 实践: Metallic流程贴图 转 Specular流程贴图

文章目录 目的Metallic Flow - SP - 输出输出的 MRA (MGA) 贴图 Metallic->Specular (根据教程一步一步实践)1. Base color Metallic -> Diffuse2. Base color Metallic -> Specular3. Roughness -> Glossiness输出贴图,在 unity 中展示:M…

内网测速工具-LibreSpeed

github链接: https://github.com/librespeed/speedtest-android

如何系列 如何使用OpenCV进行图像操作

文章目录 简介集成代码示例加载和显示图像编辑和保存图像边缘检测图片属性图像旋转图像缩放图像拼接颜色空间转换图像模糊平滑化腐蚀和膨胀直方图均衡化图像分割模板匹配图像特征提取图像拟合图像标注轮廓检测背景减除图像混合颜色分割图像旋转裁剪在图像上写文字检测和裁剪人脸…

大模型Tuning分类

类型总结 微调(Fine-tunning) 语言模型的参数需要一起参与梯度更新 轻量微调(lightweight fine-tunning) 冻结了大部分预训练参数,仅添加任务层,语言模型层参数不变 适配器微调 (Adapter-t…

Java项目-文件搜索工具

目录 项目背景 项目效果 SQLite的下载安装 使用JDBC操作SQLite 第三方库pinyin4j pinyin4j的具体使用 封装pinyin4j 数据库的设计 创建实体类 实现DBUtil 封装FileDao 设计scan方法 多线程扫描 周期性扫描 控制台版本的客户端 图形化界面 设计图形化界面 项目…

PyTorch - 模型训练损失 (Loss) NaN 问题的解决方案

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/133378367 在模型训练中,如果出现 NaN 的问题,严重影响 Loss 的反传过程,因此,需要加入一些微小值…

什么是 Spring Boot?与传统 Spring 框架的区别

什么是 Spring Boot?与传统 Spring 框架的区别 引言 Spring框架是一个在Java应用程序开发中广泛使用的框架,它提供了一种构建企业级Java应用程序的强大方式。然而,Spring框架在一些方面存在复杂性和繁琐的配置,这促使Spring社区…

leetcode:561. 数组拆分(python3解法)

难度:简单 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。 返回该 最大总和 。 示例 1: 输入:nums [1,4,3,2] 输出…

软件设计模式系列之十八——迭代器模式

1 模式的定义 迭代器模式是一种行为型设计模式,它允许客户端逐个访问一个聚合对象中的元素,而不暴露该对象的内部表示。迭代器模式提供了一种统一的方式来遍历不同类型的集合,使客户端代码更加简洁和可复用。 2 举例说明 为了更好地理解迭…

护眼灯买哪种好?分享五款护眼灯

家里顶灯太暗了且高度太高,还是原始的LED灯,晚上用着眼睛都有点难受,还好遇到了儿童护眼灯。下面小编为大家介绍下儿童护眼灯哪个牌子好?什么护眼台灯比较专业 1、色温 台灯的色温也是一个需要考虑的因素,所谓的色温其…

数学建模常用模型

作为数学建模的编程手还掌握一些各类模型常用算法,数学建模评价类模型、分类模型、预测类模型比较常用的方法总结如下: 接下来对这些比较典型的模型进行详细进行介绍说明。 一、评价模型 在数学建模中,评价模型是比较基础的模型之一&#x…