【JavaScript高级】04-JavaScript函数增强

news2025/1/20 2:55:58

JavaScript函数增强

    • 函数属性和arguments
      • 函数对象的属性
      • 函数中的arguments
        • arguments转Array
    • 函数的剩余参数
    • 纯函数的理解和应用
      • JavaScript纯函数定义
      • 纯函数案例
    • 柯里化的理解和应用
      • 柯里化定义
    • 组合函数理解和应用

函数属性和arguments

函数对象的属性

在JavaScript中函数也是一个对象,那么对象中就可以有属性和方法。

  • 属性name:一个函数的名词我们可以通过name来访问;
function foo(){
}
console.log(foo.name)/ /foo
var bar = function() {
}
console.log(bar.name)//bar
  • 属性length:属性length用于返回函数参数的个数;注意: rest参数是不参与参数的个数的;
 var baz = (name,age, ...args) =>{
 }
console.log(baz.length)

函数中的arguments

arguments是一个对应于传递给函数的参数的类数组(array-like)对象。

在这里插入图片描述

array-like意味着它不是一个数组类型,而是一个对象类型:

  • 但是它却拥有数组的一些特性,比如说length,比如可以通过index索引来访问;
  • 但是它却没有数组的一些方法,比如filter、map等;
console.log(arguments.length)
console.log(arguments[0]
console.log(arguments[1])
console.log(arguments[2])

arguments转Array

在开发中,经常需要将arguments转成Array,以便使用数组的一些特性。常见的转化方式如下 :

  1. 遍历arguments,添加到一个新数组中;
  2. 较难理解(有点绕),了解即可调用数组slice函数的call方法;
  3. ES6中的两个方法Array.from;[…arguments]
    在这里插入图片描述

箭头函数是不绑定arguments的,所以在箭头函数中使用arguments会去上层作用域查找:

在这里插入图片描述
在这里插入图片描述

函数的剩余参数

ES6中引用了rest parameter,可以将不定数量的参数放入到一个数组中:

  • 如果最后一个参数是…为前缀的,那么它会将剩余的参数放到该参数中,并且作为一个数组;
function  foo(m, n, ...args){
console.log(m, n)
console.log(args)
}
  • 剩余参数和arguments的区别
  1. 剩余参数只包含那些没有对应形参的实参,而 arguments对象包含了传给函数的所有实参;
  2. arguments对象不是一个真正的数组,而rest参数是一个真正的数组,可以进行数组的所有操作;
  3. arguments是早期的ECMAScript中为了方便去获取所有的参数提供的一个数据结构,而rest参数是ES6中提供并且希望以此来替代arguments的;

剩余参数必须放到最后一个位置,否则会报错。

纯函数的理解和应用

JavaScript纯函数定义

  • 函数式编程中有一个非常重要的概念叫纯函数,JavaScript符合函数式编程的范式,所以也有纯函数的概念;
  1. 在react开发中纯函数是被多次提及的;
  2. 比如react中组件就被要求像是一个纯函数(为什么是像,因为还有class组件),redux中有一个reducer的概念,也是要求必须是一个纯函数;
  3. 所以掌握纯函数对于理解很多框架的设计是非常有帮助的;
  • 纯函数的维基百科定义:

在程序设计中,若一个函数符合以下条件,那么这个函数被称为纯函数:

  1. 此函数在相同的输入值时,需产生相同的输出
  2. 函数的输出和输入值以外的其他隐藏信息或状态无关,也和由I/O设备产生的外部输出无关
  3. 该函数不能有语义上可观察的函数副作用,诸如“触发事件”使输出设备输出,或更改输出值以外物件的内容等。

总结:确定的输入,一定会产生确定的输出;函数在执行过程中,不能产生副作用;

副作用解释:

在计算机科学中,也引用了副作用的概念,表示在执行一个函数时,除了返回函数值之外,还对调用函数产生了附加的影响,比如修改了全局变量,修改参数或者改变外部的存储;

纯函数案例

以对数组操作的两个函数为例:

  • slice: slice截取数组时不会对原数组进行任何操作,而是生成一个新的数组;
  • splice: splice截取数组,会返回一个新的数组,也会对原数组进行修改;

slice就是一个纯函数,不会修改数组本身,而splice函数不是一个纯函数;

var names =[ "abc" ,  "cba" ,  "nba" , "dna"]
// slice截取数组时不会对原数组进行任何操作,而是生成一个新的数组
var newNames =names.slice(02)
console.log (newNames)
//splice截取数组,·会返回一个新的数组,也会对原数组进行修改
var newNames2 = names.splice(02)
console.log(newNames2)
console.log(names)

纯函数的优势

(1)代码阅读性提高
(2)提高了代码的复用性
(3)IO简单,测试简单
(4)可作缓存或记忆功能

  • 可以安心的编写和安心的使用;
  • 在写的时候保证了函数的纯度,只是单纯实现自己的业务逻辑即可,不需要关心传入的内容是如何获得的或者依赖其他的外部变量是否已经发生了修改;
  • 用的时候,只需要确定输入内容不会被任意篡改,并且自己确定的输入,一定会有确定的输出;

柯里化的理解和应用

柯里化定义

柯里化也是属于函数式编程里面一个非常重要的概念。

  • 是一种关于函数的高阶技术;
  • 它不仅被用于JavaScript,还被用于其他编程语言;

维基百科的解释:

在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化:

  • 是把接收多个参数的函数,变成接收一个单一参数(最初函数的第一个参数)的函数,并且返回接收余下的参数而且返回结果的新函数的技术;
  • 柯里化声称“如果你固定某些参数,你将得到接收余下参数的一个函数”;

理解总结

传递给函数一部分参数来调用它,让它返回一个函数去处理剩余的参数。这个过程就称之为柯里化;

柯里化是一种函数的转换,将一个函数从可调用的f(a, b, d)转换为可调用的f(a)(b)(d)。口柯里化不会调用函数。它只是对函数进行转换。

柯里化过程代码示例

//未柯里化的函数
function add1(x,y,z){
	return X +y +z
}
console.log(add1(1020,30))
//柯里化处理的函数
function add2(x){
	return function(y){
		return function(z){
			return x +y +z
		}
	}
}
console.log(add2 (10) (20)(30))
//使用箭头函数优化
var add3 = × => y => z =>{
	return x +y+z
}
console.log (add3 (10)(20) (30))

//var foo3 = X =>y=>Z=>console.log(x +y + z)

组合函数理解和应用

组合(Compose)函数是在JavaScript开发过程中一种对函数的使用技巧、模式:

  • 比如在需要对某一个数据进行函数的调用执行两个函数fn1和fn2,这两个函数是依次执行的;如果每次都需要进行两个函数的调用操作上就会显得重复;
  • 将这两个函数组合起来,自动依次调用的这个过程就是对函数的组合,称之为组合函数(Compose Function) ;

组合通用函数的封装(了解)

function hyCompose(...fns) {
  var length = fns.length
  for (var i = 0; i < length; i++) {
    if (typeof fns[i] !== 'function') {
      throw new TypeError("Expected arguments are functions")
    }
  }

  function compose(...args) {
    var index = 0
    var result = length ? fns[index].apply(this, args): args
    while(++index < length) {
      result = fns[index].call(this, result)
    }
    return result
  }
  return compose
}

function double(m) {
  return m * 2
}

function square(n) {
  return n ** 2
}

var newFn = hyCompose(double, square)
console.log(newFn(10))


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

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

相关文章

维格云自定义按钮入门教程

目录 维格云自定义按钮功能简介 维格云自定义按钮适用场景 维格云自定义按钮设置步骤 开启插件 在拓展设置中创建按钮 在数据表中添加自定义按钮 效果展示 维格云自定义按钮注意事项 维格云自定义按钮功能简介 给不同情境下的数据详情页面,添加按钮,点击后可往另一个…

【博弈论】极小极大搜索(Minimax Algorithm)与α-β剪枝(Alpha-Beta Pruning)

文章目录一、极大极小搜索&#xff08;Minimax Algorithm&#xff09;二、α-β剪枝&#xff08;Alpha-Beta Pruning&#xff09;三、解题技巧一、极大极小搜索&#xff08;Minimax Algorithm&#xff09; 在零和博弈&#xff08;有完整信息的&#xff0c;确定的、轮流行动的&…

steam搬砖项目月入过万靠谱吗

大家好&#xff0c;我是阿阳 什么是国外steam游戏装备汇率差项目 一、项目介绍 其实&#xff0c;Steam就是一个美国的游戏平台&#xff0c;搬砖主要是搬的一款火遍全球的游戏CSGO的装备和饰品。CS听说过吧&#xff0c;这款游戏就是CS的一个系列。&#xff08;通俗易懂的理解就…

【C++数据结构】性能测量

性能测量 4.1 引言 容易计算内存的需求大小&#xff0c;只要知道编译后的代码和数据空间的大小就可以了&#xff1b; 数据空间的大小取决于用户所要解决的问题实例的大小。 要确定程序运行时间&#xff0c;需要通过实验来测量。 程序性能不仅依赖操作类型和数量&#xff0c…

Excel逆向查询的多种方法,赶快学起来

关于匹配查询&#xff0c;我们平时用的做多的就是VLOOKUP函数了&#xff0c;但VLOOKUP函数只能正向查找&#xff0c;不能逆向查询。 像是下面这种情况就不可以&#xff1a; &#xff08;现在我们想用编码去匹配书名&#xff09; 如果在不改变原表格结构的基础上查找出书目编码…

当MySQL和java通过媒婆navicate谈上了恋爱 ------ MySQL的安装和Java的连接

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 **收录于专栏 数据库 ⭐当MySQL和java通过媒婆navicate谈上了恋爱⭐ 文章目录⭐当MySQL和java通过媒婆navicate谈上了恋爱…

vue组件库发布到npm

修改项目的信息 在package.json文件中&#xff1a; 修改Readme文件的信息 注册npm 账号 指路官网 vscode终端登录npm 执行 npm login 输入用户名&#xff0c;密码&#xff0c;邮箱&#xff0c;邮箱验证码 如下图 执行 npm publish 如下图 出现的问题 npm ERR! code E403 …

CSAPP Lab6:Malloc

文章目录一、实验简介二、隐式链表实现基本宏块的相关函数mm_initmm_mallocmm_freemm_reallocextend_heapblk_mergeblk_findblk_split使用下次匹配三、显式链表实现四、分离适配五、完整代码隐式链表显式链表课本实现一、实验简介 实现一个动态内存分配器。 tar xvf mallocla…

Linux 应急响应命令总结,收藏版

系统排查 系统基本信息 CPU 信息 CPU 信息&#xff1a;lscpu 操作系统信息 操作系统信息&#xff1a;uname -a 操作系统信息&#xff1a;cat /proc/version 模块信息 模块信息&#xff1a;lsmod 账户信息 系统所有账户 系统所有账户&#xff1a;cat /etc/passwd 超级权限账户 超…

3D-SKIPDENSESEG医学图像分割

蓝色三角、黄色三角、红色三角相对应。 得到第三个feature map&#xff0c;反卷积会恢复到原来的尺寸 Dense block&#xff0c;通道增加了 Transition&#xff0c;池化 用正则表达式把里面的h5文件匹配一下吧 os.path.join()把两个部分的路径拼一下 root_path —data_train *.…

[kubernetes]-k8s开启swap

导语&#xff1a;记录k8s开启swap后先后做的调整 测试版本 k8s1.20版本 使用参数--fail-swap-onfalse Environment"KUBELET_EXTRA_ARGS--fail-swap-onfalse"使用测试 可以开启swap不报错 但是pod使用swap不太理想。且无法实现在使用swap的时候限制pod的内存。会造…

【Java面试】List接口

文章目录Iterator 和 ListIterator 有什么区别&#xff1f;遍历一个 List 有哪些不同的方式&#xff1f;每种方法的实现原理是什么&#xff1f;Java中List 遍历的最佳实践是什么&#xff1f;说一下 ArrayList 的优缺点如何实现数组和 List 之间的转换&#xff1f;ArrayList 和 …

M4 tm4c1294单片机软件调式总结

1&#xff0c;框架图&#xff1a; 调式基本方法&#xff1a; &#xff08;1&#xff09;加串口打印初始化&#xff0c;单步跟踪查看&#xff0c;类似gdb的单步&#xff1b; &#xff08;2&#xff09;打印命令行&#xff0c;重点参数添加命令行打印; &#xff08;3&#xff…

Redis 的相关基础知识

【一】 Redis 中默认的端口号为什么是6379 图中的人名为 Alessia Merz &#xff0c;其中的 Merz 对应的九键输入法按出来的就是6379 【二】 Redis 默认的数据库 Redis 中默认使用的是16个数据库&#xff0c;类似数组下标从0开始&#xff0c;初始默认使用0号数据库 【三】 Redis…

vscode搭建Verilog HDL开发环境

工欲善其事&#xff0c;必先利其器。应该没有多少人会使用Quartus和vivado这些软件自带的编辑器吧&#xff0c;原因在于这些编辑器效率很低&#xff0c;Verilog HDL代码格式比较固定&#xff0c;通常可以利用代码片段补全加快书写。基本上代码写完之后才会打开Quartus或者vivad…

一文带你了解Spring中的事务管理

文章目录前言一、事务的基础概念二、spring中事务的使用声明式事务编程式事务如何选择事务方式三、spring中事务管理实现原理前言 本文将涉及以下知识点&#xff1a; 事务的基础概念spring当中事务的使用spring当中事务管理的实现原理 一、事务的基础概念 事务&#xff08;T…

python画图

python画图1.使用matplotlib画图2.使用pyecharts画图2.x pyecharts的三种图片渲染工具2.x.1 snapshot_selenium2.x.2 snapshot_phantomjs2.x.3 snapshot_pyppeteer1.使用matplotlib画图 2.使用pyecharts画图 pyecharts是一款将python与echarts结合的强大的数据可视化工具&…

阿里云服务器安装tomcat

一、前置条件 安装tomcat需要先安装jdk&#xff0c;所以没有安装jdk同学&#xff0c;详见参考文章或者此文章 二、Linux上安装tomcat 1. 下载Apache tomcat tomcat官网下载地址 在左边&#xff0c;可以选择下载各种版本的tomcat。根据服务器操作系统选择下载。Linux操作系统…

第七章TCP/IP——ARP网络攻击与欺骗

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。个人爱好: 编程&#xff0c;打篮球&#xff0c;计算机知识个人名言&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石…

分布式文件系统和对象存储魔力象限,右上角都有谁?

自Gartner 首次发布      分布式文件系统和      对象存储魔力象限以来      戴尔科技集团      就牢牢位居领导者象限      今年也不例外      恭喜      连续第七年获评领导者!    对于入选本年度的魔力象限领导者,我们感到十分荣幸。我们相…