JavaScript柯里化与部分应用

🧑‍🎓 个人主页:《爱蹦跶的大A阿》

🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》

​ 

目录

✨ 前言

✨ 正文

一、函数柯里化(Currying)

什么是柯里化

柯里化实现

柯里化实例

部分应用

部分应用实现

部分应用示例

总结

二、JavaScript中的引用类型

基本类型和引用类型

对象是引用类型

赋值拷贝引用

对比基本类型

引用类型的比较

传递函数参数

总结

✨ 结语


 

✨ 前言

        JavaScript作为一门非常灵活的语言,包含许多高级功能来帮助开发者更好地编写代码。柯里化和引用类型就是其中两个重要且实用的高级概念。

        本文将详细介绍柯里化的用法,以及JavaScript中的值类型和引用类型的区别。这些都是每一位JavaScript开发者都需要深刻理解的知识点。

        通过学习本文,你将能够熟练使用柯里化技术提高函数的灵活性,并明确理解JavaScript中的值与引用的区别。这将大大提升你的JavaScript编程能力。

✨ 正文

一、函数柯里化(Currying)

什么是柯里化

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

柯里化实现

我们可以编写一个 curry 函数来实现柯里化:

function curry(func) {

  return function curried(...args) {
    if (args.length >= func.length) {
      return func.apply(this, args);
    } else {
      return function(...args2) {
        return curried.apply(this, args.concat(args2));
      }
    }
  };

}

        这个 curry 函数将多参数函数转换成单参数函数,每次接收参数直至满足函数长度要求时终止柯里化并执行函数。

柯里化实例

使用柯里化可以对参数进行预设:

function sum(a, b, c) {
  return a + b + c;
}

let curriedSum = curry(sum);

curriedSum(1)(2)(3); // 6
curriedSum(1, 2)(3); // 6

部分应用

与柯里化相似,部分应用(Partial Application)是固定一个函数的部分参数来生成一个新的函数的技术。

部分应用实现

function partial(func, ...presetArgs) {
  return function(...laterArgs) { 
    return func(...presetArgs, ...laterArgs);
  }
}

partial 接收预设参数,返回带预设参数的新函数。

部分应用示例

let partialSum = partial(sum, 1, 2);

partialSum(3); // 6
partialSum(4); // 7

固定了部分参数,获得带参数的sum函数。

总结

  • 柯里化将多参数函数转换为单参数函数
  • 部分应用固定函数的部分参数
  • 都允许参数的预设应用
  • 提高了函数适用性

柯里化和部分应用都是函数式编程中非常重要的概念。

二、JavaScript中的引用类型

基本类型和引用类型

JavaScript 中有基本类型和引用类型两种类型。

基本类型直接存储值,引用类型的值是对象,存储对象的引用(内存地址)。

对象是引用类型

在 JavaScript 中,对象属于引用类型:

let obj = {
  name: "John"  
};

obj 变量并不直接存储对象,而是存储该对象的引用。

赋值拷贝引用

对一个引用类型进行赋值时,赋的值是该对象的引用:

let obj2 = obj;

obj2.name = "Pete";

alert(obj.name); // Pete

这里 obj2 和 obj 引用的是同一个对象。

对比基本类型

和基本类型不同,对引用类型进行赋值时拷贝的是对象的引用,而不是值:

let str = "Hello";
let str2 = str; 

str2 = "Bye"; // str unchanged

基本类型不会被引用。

引用类型的比较

引用类型不能使用 == == 比较,需要通过 Object.is 比较引用。

或者可以比较特定的属性。

传递函数参数

将对象作为参数传递给函数时,同样只是传递了对象引用而不是对象本身。

总结

  • 对象属于引用类型,保存对象的引用
  • 赋值和传参都会复制引用,多个变量引用同一对象
  • 引用类型不能比较,需要比较对象属性或用 Object.is
  • 理解的值与引用的区别非常重要

这是学习 JavaScript 的重要概念之一。

 

✨ 结语

        希望通过本文,这两个重要的JavaScript高级概念不再难以理解。将它们运用到项目中,可以让我们的代码更加易于维护和扩展。

        持续学习JavaScript的核心理念,是成为资深JavaScript开发者不可或缺的素养。这将使我们的代码更加规范,健壮而优雅。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python爬各平台评论并数据分析——数据采集、评论情绪分析、新闻热度

一、爬取数据 小问题汇总 1.python之matplotlib使用系统字体 用于解决python绘图中,中文字体显示问题 2.cookie与视频页面id(b站、微博等)查看 F12打开网页开发者模式,然后F5刷新,进入控制台中的网络,…

为何外贸公司应该采用CRM客户管理软件?

在外贸行业中,客户关系管理尤为关键。在当下的大数据背景下,所有规模的外贸公司都迫切地需要进行数字化改造。无论是大型公司还是小型业务,他们都希望通过深入分析客户数据,为用户提供更优的体验,并据此调整企业战略。…

自动化批量导入机器到Jumpserver:提高效率与一致性的关键步骤

Ansible批量主机机器到Jumpserver 1、背景 在现代 IT 环境中,随着机器数量的增加和复杂性的提高,手动管理和配置机器变得越来越困难和耗时。为了提高效率并确保一致性,自动化工具成为了不可或缺的一部分。Jumpserver 是一个功能强大的堡垒机…

Linux之系统安全与应用

Linux系统提供了多种机制来确保用户账号的正当,安全使用。 系统安全措施 一. 清理系统账号 1.1 将用户设置为无法登录 Linux系统中除手动创建的各种账号外,还包括随系统或程序安装过程而生成的其他大量账号。除了超级用户root以外,其他的…

企业能源消耗监测管理系统是否可以做好能源计量与能耗分析?

能源消耗与分析是能源科学管理的基础,也可促进能源管理工作的改善,在企业中能源管理系统的作用也愈加重要。 首先,能源计量是能源管理的基础,通过能源精准计老化,容易出现测量设备不准确以及其他一些人为因素原因导致…

NC65中间件能启动,前端客户端启动失败,加载异常,卡住(org.owasp.esapi)

控制台输出错误 ESAPI.properties could not be loaded by any means. Fail.SecurityConfiguration class(org.owasp.esapi.reference.DefaultSecurityConfiguration) CTOR threw exception.效果图: 解决方案 添加如下参数: -Dorg.owasp.esapi.resou…

金融帝国实验室(Capitalism Lab)V10版本推出新招高管待命选项

金融帝国实验室(Capitalism Lab)V10版本推出新招高管待命选项 ————————————— 【全新V10版本开发播报】 即将发布的V10版本,在“分配管理器”菜单上将引入一个名为“暂时待命”的新功能。启用此选项后,分配给公司的高…

docker 网络及如何资源(CPU/内存/磁盘)控制

安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host docker网络模式 Host 容器与宿主机共享网络namespace,即容器和宿主机使用同一个IP、端口范围(容器与宿主机或其他使…

Vulnhub靶场DC-6

攻击机192.168.223.128 靶机192.168.223.134 主机发现:nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -p- -A 192.168.223.134 开启了22 80端口,80是apache 2.4.25 先进入web界面看一下 用ip进不去,应该被重定向到wordy.com vim /etc/hosts 加上 19…

【医学图像隐私保护】联邦学习:密码学 + 机器学习 + 分布式 实现隐私计算,破解医学界数据孤岛的长期难题

联邦学习:密码学 机器学习 分布式 提出背景:数据不出本地,又能合力干大事联邦学习的问题 分布式机器学习:解决大数据量处理的问题横向联邦学习:解决跨多个数据源学习的问题纵向联邦学习:解决数据分散在多…

某马头条——day11+day12

实时计算和定时计算 流式计算 kafkaStream 入门案例 导入依赖 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams</artifactId><exclusions><exclusion><artifactId>connect-json</artifactId&…

NOIP2003提高组T1:神经网络

题目链接 [NOIP2003 提高组] 神经网络 题目背景 人工神经网络&#xff08;Artificial Neural Network&#xff09;是一种新兴的具有自我学习能力的计算系统&#xff0c;在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。对神经网络的研究一直是当今的热门方向&am…

MSB30M-ASEMI小功率开关电源MSB30M

编辑&#xff1a;ll MSB30M-ASEMI小功率开关电源MSB30M 型号&#xff1a;MSB30M 品牌&#xff1a;ASEMI 正向电流&#xff08;Id&#xff09;&#xff1a;3A 反向耐压&#xff08;VRRM&#xff09;&#xff1a;1000V 正向浪涌电流&#xff1a;50A 正向电压&#xff08;…

电影《花千骨》成开年第一烂,新派系当家IP滑铁卢

2024电影市场“开年第一烂”落到了《花千骨》头上。 在整个行业都在为春节档蓄势的情况下&#xff0c;电影市场显得有些沉寂&#xff0c;票房表现也不太出彩&#xff0c;其中最大的输家莫过于新派系文化出品的电影版《花千骨》。 从1月20日上映至今&#xff0c;5天累计票房仅…

带头 + 双向 + 循环链表增删查改实现

目录 源码&#xff1a; List.c文件&#xff1a; List.h文件&#xff1a; 简单的测试&#xff1a; 很简单&#xff0c;没什么好说的&#xff0c;直接上源码。 源码&#xff1a; List.c文件&#xff1a; #include"DLList.h"ListNode* creadNode(LTDataType x) {L…

10.Elasticsearch应用(十)

Elasticsearch应用&#xff08;十&#xff09; 1.为什么需要聚合操作 聚合可以让我们极其方便的实现对数据的统计、分析、运算&#xff0c;例如&#xff1a; 什么品牌的手机最受欢迎&#xff1f;这些手机的平均价格、最高价格、最低价格&#xff1f;这些手机每月的销售情况如…

【Linux】Linux任务管理与守护进程

Linux任务管理与守护进程 一、任务管理1、进程组概念2、作业概念3、会话概念4、相关操作&#xff08;1&#xff09;前台进程&后台进程&#xff08;2&#xff09;jobs、fg、bg、kill 5、ps命令查看指定的选项 二、守护进程1、守护进程的概念2、守护进程的查看3、守护进程的创…

支付宝AES如何加密

继之前给大家介绍了 V3 加密解密的方法之后&#xff0c;今天给大家介绍下支付宝的 AES 加密。 注意&#xff1a;以下说明均在使用支付宝 SDK 集成的基础上&#xff0c;未使用支付宝 SDK 的小伙伴要使用的话老老实实从 AES 加密原理开始研究吧。 什么是AES密钥 AES 是一种高级加…

2.依附弹窗(AttachListPopup)

愿你出走半生,归来仍是少年&#xff01; 环境&#xff1a;.NET 7 基于基础的Popup对象实现的依附于某个控件的弹窗&#xff0c;弹窗可呈现数组对象&#xff0c;达到较好的选择交互效果。 1.布局 通过Border实现圆角边框轮廓&#xff0c;然后通过内部的ListView实现列表展示。…

Cesium数据加载

文章目录 0.引言1.影像加载1.1Bing地图1.2天地图1.3ArcGIS在线地图1.4高德地图1.5OSM影像1.6MapBox影像 2.OGC地图服务2.1WMS2.2WMTS2.3TMS 3.GeoJSON数据加载4.KML数据加载5.TIFF数据加载6.点云数据加载7.地形数据加载7.1在线地形数据加载7.2本地地形数据加载 8.倾斜摄影模型数…