在函数实践章节中,我们写过这样的两个函数:
观察上面两个函数,你会发现它们的逻辑几乎完全一样:
resultnumbersresult 数组result 数组唯一的不同就是判断条件!
filterGreaterThan 使用:numbers[i] > thresholdfilterEvenNumbers 使用:numbers[i] % 2 === 0思考题: 如果我们能把判断条件作为参数传递,就能创建一个通用的过滤函数!这就引出了编程中一个非常重要的概念:函数作为参数。
但是,要让函数能够接收其他函数作为参数,我们首先需要学习 TypeScript 的自定义类型系统,特别是如何定义"函数的类型"。
在传统编程中,我们习惯于将数据(数字、字符串、数组等)作为参数传递给函数。但更强大的是:函数本身也可以作为参数传递给其他函数!
生活类比:
这个概念的重要性:
在深入学习函数作为参数之前,我们需要了解 TypeScript 的 type 关键字,它可以用来定义新的类型:
现在我们知道了函数可以作为参数,JavaScript/TypeScript 为我们提供了许多内置的数组方法,这些方法都接收函数作为参数,让我们能够用更优雅的方式处理数组数据!
| 方法 | 功能 | 返回值 | 函数参数说明 |
|---|---|---|---|
filter() | 过滤数组 | 新数组 | (item, index, array) => boolean |
map() | 转换每个元素 | 新数组 | (item, index, array) => any |
reduce() | 累积计算 | 单个值 | (accumulator, item, index, array) => any |
forEach() | 遍历执行 | undefined | (item, index, array) => void |
find() | 查找元素 | 找到的元素或undefined | (item, index, array) => boolean |
some() | 是否有满足条件的 | boolean | (item, index, array) => boolean |
every() | 是否都满足条件 | boolean | (item, index, array) => boolean |
filter() 方法创建一个新数组,包含所有通过测试的元素。
map() 方法创建一个新数组,其结果是对原数组中的每个元素调用提供的函数后的返回值。
reduce() 方法对数组中的每个元素执行一个reducer函数(升序执行),将其结果汇总为单个返回值。
让我们结合所有学到的数组方法来处理一个完整的游戏数据场景:
现在我们已经掌握了函数作为参数和数组方法,让我们学习一种让这些概念使用起来更加简洁优雅的工具:箭头函数!
在传统编程中,我们这样定义函数:
箭头函数提供了更简洁的写法:
| 传统函数 | 箭头函数 | 说明 |
|---|---|---|
function name(param) { return value; } | const name = (param) => value; | 单参数,单返回值 |
function name(param1, param2) { ... } | const name = (param1, param2) => { ... } | 多参数,多行代码 |
function name() { return value; } | const name = () => value; | 无参数,单返回值 |
1. 单参数,单行返回
2. 多参数,单行返回
3. 多行逻辑,需要大括号
4. 无参数的箭头函数
箭头函数与数组方法是天生的一对!让我们的代码变得更加简洁优雅:
1. 语法简洁
2. 函数式编程友好
3. 更好的this绑定(高级概念)