函数传参string_JavaScript 高阶函数入门浅析
原文:https://www.freecodecamp.org/news/a-quick-intro-to-higher-order-functions-in-javascript-1a014f89c6b/
译者:jingruzhang
校对者:acusp
高阶函数
高阶函数可以接收函数作为参数,同时也可以返回一个新的函数。
高阶函数之所以高阶,是因为高阶函数的参数和返回值对象可以是函数,这超越了普通函数处理的数据类型,例如字符串(strings)、数字(numbers)、布尔值(booleans)等。
JavaScript 中,函数的应用场景很丰富:
作为变量存储
在数组中使用
作为对象属性(即方法)
作为参数传递
作为其他函数的返回值
理解高阶函数的关键在于,函数即数据。
数据是函数运作的基本
数据:字符串(Strings)
sayHi = (name) => `Hi, ${name}!`;result = sayHi('User');
console.log(result); // 'Hi, User!'
数据:数字(Numbers)
double = (x) => x * 2;result = double(4);
console.log(result); // 8
数据:布尔值(Booleans)
getClearance = (allowed) => allowed ? 'Access granted' : 'Access denied';
result1 = getClearance(true);result2 = getClearance(false);
console.log(result1); // 'Access granted'console.log(result2); // 'Access denied'
数据:对象(Objects)
getFirstName = (obj) => obj.firstName;
result = getFirstName({ firstName: 'Yazeed'});
console.log(result); // 'Yazeed'
数据:数组(Arrays)
len = (array) => array.length;result = len([1, 2, 3]);
console.log(result); // 3
在所有的主流语言中,以上这五种数据类型被称为 “头等对象”(原文:first-class citizen, https://www.wikiwand.com/en/First-class_citizen)。
为什么是“头等”呢?因为这五种数据类型既可以作为参数传递,又可以存储在变量或者数组中,还可以作为变量用于计算,是数据的基本形式。
函数也是数据
函数作为参数
isEven = (num) => num % 2 === 0;result = [1, 2, 3, 4].filter(isEven);
console.log(result); // [2, 4]
请观察 filter
函数是如何使用 isEven
函数来判断要保留哪些内容的。这里的 isEven
是一个函数,作为参数传入了 filter
函数中。
filter
函数每次在做判断的时候都会调用 isEven
函数,用 isEven
函数返回的布尔值来决定当前数值的去留。
函数作为返回值
add = (x) => (y) => x + y;
add
函数需要两个参数,但不需要它们俩同时传入,第一次传参传入 x
就会返还一个新函数,这个函数需要传入 y
参数。
能够这样操作的基础在于 JavaScript 语言允许函数本身作为返回值存在,就像函数可以返回字符串(strings)、数字(numbers)、布尔值(booleans)等,JS 函数还可以返回另一个函数。
当然,我们也可以使用“双重调用”的方式,一次性提供 x
和 y
两个参数:
result = add(10)(20);
console.log(result); // 30
或者分两次调用,先传参数 x
,再传参数 y
:
add10 = add(10);result = add10(20);
console.log(result); // 30
在上面这个例子中, add10
函数是第一次调用 add
函数的返回值,可以尝试用 console.log
把结果打出来观察一下。
add10
函数会接收 y
参数,然后返回 x + y
值。一旦 y
值到位,函数会立马进行运算并返回结果。
可重复利用性
高阶函数的魅力在于它的可重复利用性,如果不是高阶函数,map
、filter
、reduce
等强大的数组函数就不可能存在。
假设我们有一组用户,如下所示,然后我们要对该数组进行操作。
users = [ { name: 'Yazeed', age: 25 }, { name: 'Sam', age: 30 }, { name: 'Bill', age: 20 }];
Map
没有高阶函数的话,我们必须回到 for
循环的怀抱才能实现 map
函数的操作。
getName = (user) => user.name;usernames = [];
for (let i = 0; i const name = getName(users[i]);
usernames.push(name);}
console.log(usernames);// ["Yazeed", "Sam", "Bill"]
用 map
函数就简单多啦!
usernames = users.map(getName);
console.log(usernames);// ["Yazeed", "Sam", "Bill"]
Filter
在没有高阶函数的情况下,必须要用 for
循环来实现 filter
函数的功能。
startsWithB = (string) => string.toLowerCase().startsWith('b');
namesStartingWithB = [];
for (let i = 0; i if (startsWithB(users[i].name)) { namesStartingWithB.push(users[i]); }}
console.log(namesStartingWithB);// [{ "name": "Bill", "age": 20 }]
用 filter
函数就简单多啦!
namesStartingWithB = users.filter((user) => startsWithB(user.name));
console.log(namesStartingWithB);// [{ "name": "Bill", "age": 20 }]
Reduce
reduce
函数也是的……没有高阶函数的话,很多高端操作都是无法实现的!
total = 0;
for (let i = 0; i total += users[i].age;}
console.log(total);// 75
那这样是不是简单多啦?
totalAge = users.reduce((total, user) => user.age + total, 0);
console.log(totalAge);// 75
总结
字符串(strings)、数字(numbers)、布尔值(booleans)、数组(arrays)、对象(objects)可以作为变量(variables)、数组(arrays)、属性( properties)或者方法(methods)存储起来。
JavaScript 语言中,函数也是像数据一样同等对待的。
因此函数可以作为另外一个函数的参数或者返回值使用,这样的做法叫高阶函数。
map
、filter
、reduce
等函数就是高阶函数的最佳代表,它们让数组的处理(改变,搜索,相加等)变得简单不少!
函数传参string_JavaScript 高阶函数入门浅析相关推荐
- python学习-高阶函数(函数传参、返回函数(闭包)、匿名函数lambda)
文章目录 高阶函数 函数传参 返回函数(闭包) 匿名函数lambda 高阶函数 定义: 至少满足下列一个条件: 接受一个或多个函数作为输入 输出一个函数 python里的高阶函数有 filter.ma ...
- export function函数传参_04 js高阶函数(惰性函数、柯里化函数、compose函数)和单例设计模式...
高阶函数的定义 在<javascript设计模式和开发实践>中是这样定义的. 函数可以作为参数被传递: 函数可以作为返回值输出. 结合这两个特点,首先想到的肯定是回调函数,回调函数也是高阶 ...
- 1.函数的结构,调用,传参,形参,实参,args,kwargs,名称空间,高阶函数
1.函数的初识 初始函数 获取任意一个字符串的元素的个数 s1='dsjdkjkfefenga' count=0 for i in s1:count+=1 print(count) 获取列表的元素的个 ...
- Scala入门到精通——第十三节 高阶函数
本节主要内容 高阶函数简介 Scala中的常用高阶函数 SAM转换 函数柯里化 部分应用函数 1. 高阶函数简介 高阶函数主要有两种:一种是将一个函数当做另外一个函数的参数(即函数参数):另外一种是返 ...
- Scala入门到精通——第五节 函数、高阶函数与闭包
本节主要内容 (一)函数字面量(值函数) (二)匿名函数 (三)函数的简化 (四)函数参数 (四)闭包 函数字面量(值函数) 函数字面量(function literal),也称值函数(functio ...
- python高阶函数闭包装饰器_Python自学从入门到就业之高阶函数、嵌套函数、闭包、装饰器...
高阶函数 在Python中,函数其实也是一种数据类型. def test(): return 'hello world' print(type(test)) # 函数对应的数据类型是 function ...
- python偏函数和高阶函数_【Python入门】8.高阶函数之 匿名函数和偏函数
目录 高阶函数 匿名函数 lambda 偏函数 高阶函数 匿名函数 lambda lambda,即希腊字母λ.顾名思义,匿名函数没有函数名,在运用时采取lambda x : ...的方式,如lambd ...
- JavaScript高阶函数快速入门
高阶函数 (Higher-Order Functions) A function that accepts and/or returns another function is called a hi ...
- scala入门之高阶函数案例
基于Java学习scala 高阶函数练习案例 1.定义一个高阶函数,按照指定的规则对集合里面的每个元素进行操作 2.定义一个高阶函数,按照指定的规则对集合中的所有元素进行聚合 3.定义一个高阶函数,按 ...
最新文章
- 干货丨一文看懂人工智能、机器学习和深度学习的区别与联系
- 在Docker中的ubuntu中安装Python3和Pip
- 【深度学习】深度学习语义分割理论与实战指南.pdf
- 给未来的自己一封信计算机,给未来的自己一封信
- nginx学习九 upstream 负载均衡
- oracle 11g函数包缓存,Oracle11新特性——PLSQL函数缓存结果(一)
- 智能硬件的时代,嵌入式是否已经日薄西山
- 电商管理系统源码_Dubbo/SSM/Elasticsearch/Redis/MySQL搭建分布式电商购物商城
- web面试 new操作符到底干了什么?
- 利用系统级别的光谱成像技术分析细胞器的互作组学
- 基于51单片机ADC0808自动数字电压表仿真数码管显示
- 设计一个具有大纯时延时间的一阶惯性环节的计算机控制系统,具有纯滞后一阶惯性系统计算机控制系统设计.pdf...
- 排序算法---堆排序
- android 多开app store,苹果手机如何做到微信双开?
- Android项目开发教程之OpenGL ES
- 高斯模糊的算法(高斯权重)
- 信息编码--区位码,国标码,内码
- E2E测试---Cypress 使用
- 输出英文字母的后继字母 c语言,Java 【打印俄文的英文字母】
- vue 数组中嵌套数组_vue数组嵌套数组的问题
热门文章
- 《零基础看得懂的C++入门教程 》——(3)表达式花样挺多鸭
- 江苏信息考试access_软考 信息处理技术员备考复习攻略
- 史上最“可怕”的数学科普,能全都看懂的只有天才!
- 理工男都能有多痴情?
- 老师“鬼话”全曝光!哈哈哈哈哈全国的老师都这样吗?
- 一定要多角度看事物 | 今日最佳
- 通过简单的Word Count讲解MapReduce原理以及Java实现
- 2021年度最全面JVM虚拟机,类加载过程与类加载器
- 10kv电压互感器型号_电压互感器型号大全
- icd11中文版精神障碍pdf_精神与行为障碍类别目录(ICD-11)