2 # 函数柯里化

简介: 2 # 函数柯里化

什么是函数柯里化

函数柯里化(Currying)是一种将接受多个参数的函数转换为一系列接受单一参数的函数的技术。

通过函数柯里化,我们可以将原来接受多个参数的函数,转换为一系列只接受单一参数的函数,每个函数接收一个参数,返回一个新函数,最后一个新函数返回最终结果。

例子:

function add(x, y, z) {
    return x + y + z;
}
console.log(add(1, 2, 3));

我们可以通过函数柯里化将其转换为一个接受单一参数的函数,并返回一个新的函数,直到所有参数都被传递完毕为止。

function curryingAdd(x) {
    return function (y) {
        return function (z) {
            return x + y + z;
        };
    };
}
console.log(curryingAdd(1)(2)(3));

函数柯里化本质上是一种闭包的应用,通过保留原函数的参数,生成一个新函数,在新函数中再次调用原函数并传递参数,最终得到结果。

例子:判断变量的类型

常用的判断类型的方法有四种

  1. typeof 不能判断对象类型 (typeof []typeof {} 都是 ‘object’)
  2. constructor 可以找到这个变量时通过谁构造出来的
  3. instanceof 判断谁是谁的实例 __proto__
  4. Object.prototype.toString.call() 不能细分谁是谁的实例
function isType(type, value) {
    return Object.prototype.toString.call(value) === `[object ${type}]`;
}
console.log(isType("Array", []));

细分方法:我们可以写成下面的形式

function isType2(type) {
    return function (value) {
        return Object.prototype.toString.call(value) === `[object ${type}]`;
    };
}
let isArray = isType2("Array");
console.log(isArray({}));

如何通过一个柯里化函数实现通用的柯里化方法?

const currying = (fn, arr = []) => {
    // 函数的长度 length 属性指明函数的形参个数。
    let len = fn.length;
    return function (...args) {
        let newArr = [...arr, ...args];
        if (newArr.length < len) {
            // 递归
            return currying(fn, newArr);
        } else {
            return fn(...newArr);
        }
    };
};

测试例子

let isArray2 = currying(isType)("Array");
console.log("isArray2----------");
console.log(isArray2("kaimo"));
console.log(isArray2([]));
let isString2 = currying(isType)("String");
console.log("isString2----------");
console.log(isString2("kaimo"));
console.log(isString2([]));
let add2 = currying(add);
console.log("add2----------");
console.log(add2(1)(2)(3));

目录
相关文章
|
NoSQL 索引 MongoDB
MongoDB ObjectId详解及使用
MongoDB中我们经常会接触到一个自动生成的字段:”_id”,类型为ObjectId。 本文详解ObjectId的构成和使用。 ObjectId构成 之前我们使用MySQL等关系型数据库时,主键都是设置成自增的。
1327 0
|
SQL 关系型数据库 专有云
实时数仓 Hologres产品使用合集之如何针对模糊匹配查询设置索引
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
一篇文章让你搞懂浮点数在内存中的存储机制[保姆级教学]
一篇文章让你搞懂浮点数在内存中的存储机制[保姆级教学]
|
存储 分布式计算 Hadoop
Hadoop之Hbase安装和配置
Hadoop之Hbase安装和配置
1622 1
|
存储 SQL 传感器
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(6)
接下来我们讨论一下关于创建存储组的相关方面,在这里值得注意的是,当路径本身或路径的父/子层已经被设置为存储组时,则不允许将路径设置为存储组。例如,设置是不可行的​​root.ln.wf01​​存在两个存储组时,作为一个存储组​​root.ln​​和​​root.sgcc​​。系统会给出相应的错误提示。
417 0
|
JSON 安全 算法
看完就懂-SpringSecurity+JWT 实现单点登录
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统
840 0
|
关系型数据库 MySQL Java
最新版 PHPMyAdmin 的安装和使用 | 学习笔记
快速学习最新版 PHPMyAdmin 的安装和使用
454 0
最新版 PHPMyAdmin 的安装和使用 | 学习笔记
谈一谈|Matlab仿真项目简介
谈一谈|Matlab仿真项目简介
195 0
|
开发工具 git
如何使用GitHub LFS让git处理大文件
如何使用GitHub LFS让git处理大文件
|
Unix Linux Perl
Linux 下的文件锁
当进程想要修改文件的时候,申请独占锁(写锁),当进程想要读取文件数据的时候,申请共享锁(读锁)。
343 0