您好,登录后才能下订单哦!
# JS5高阶函数有哪些
## 目录
1. [什么是高阶函数](#什么是高阶函数)
2. [JS5中常见的高阶函数](#js5中常见的高阶函数)
- [Array.prototype.map](#arrayprototypemap)
- [Array.prototype.filter](#arrayprototypefilter)
- [Array.prototype.reduce](#arrayprototypereduce)
- [Array.prototype.forEach](#arrayprototypeforeach)
- [Array.prototype.some](#arrayprototypesome)
- [Array.prototype.every](#arrayprototypeevery)
- [Array.prototype.find](#arrayprototypefind)
- [Array.prototype.sort](#arrayprototypesort)
3. [函数作为返回值的高阶函数](#函数作为返回值的高阶函数)
4. [自定义高阶函数实践](#自定义高阶函数实践)
5. [高阶函数的优势](#高阶函数的优势)
6. [注意事项](#注意事项)
7. [总结](#总结)
---
## 什么是高阶函数
高阶函数(Higher-Order Function)是指满足以下任一条件的函数:
- 接受一个或多个函数作为参数
- 返回一个函数作为结果
在JavaScript中,函数是一等公民(First-class Citizen),这意味着函数可以像其他数据类型一样被传递和操作,这种特性使得高阶函数在JS中非常常见且强大。
```javascript
// 示例:函数作为参数
function greet(name, formatter) {
return formatter(name);
}
// 使用高阶函数
const result = greet('John', (n) => `Hello, ${n}!`);
console.log(result); // "Hello, John!"
作用:对数组每个元素执行回调函数,返回新数组
时间复杂度:O(n)
是否改变原数组:❌
const numbers = [1, 2, 3];
const squares = numbers.map(x => x * x);
console.log(squares); // [1, 4, 9]
典型应用场景: - 数据格式转换 - 提取对象特定属性
作用:筛选满足条件的元素组成新数组
时间复杂度:O(n)
是否改变原数组:❌
const users = [
{ id: 1, active: true },
{ id: 2, active: false }
];
const activeUsers = users.filter(user => user.active);
console.log(activeUsers); // [{ id: 1, active: true }]
注意事项: - 回调函数必须返回布尔值 - 空元素不会被执行
作用:将数组归约为单个值
时间复杂度:O(n)
是否改变原数组:❌
const sum = [1, 2, 3].reduce((acc, cur) => acc + cur, 0);
console.log(sum); // 6
高级用法: - 多维数组扁平化 - 统计词频 - 函数组合
作用:遍历数组执行副作用操作
时间复杂度:O(n)
是否改变原数组:可能(取决于回调)
['a', 'b', 'c'].forEach((item, index) => {
console.log(`${index}: ${item}`);
});
// 0: a
// 1: b
// 2: c
与map的区别: - 无返回值 - 不能链式调用 - 无法中断遍历(除非抛出异常)
作用:检测是否有元素满足条件
时间复杂度:O(n)(最坏情况)
是否改变原数组:❌
const hasEven = [1, 3, 5, 7, 8].some(n => n % 2 === 0);
console.log(hasEven); // true
性能优化: - 找到符合条件的元素后立即返回 - 空数组始终返回false
作用:检测所有元素是否都满足条件
时间复杂度:O(n)(最坏情况)
是否改变原数组:❌
const allValid = [2, 4, 6].every(n => n % 2 === 0);
console.log(allValid); // true
短路特性: - 遇到第一个不满足条件的元素立即返回false
作用:返回第一个满足条件的元素
时间复杂度:O(n)(最坏情况)
是否改变原数组:❌
const inventory = [
{name: 'apples', quantity: 2},
{name: 'bananas', quantity: 0}
];
const result = inventory.find(item => item.name === 'bananas');
console.log(result); // { name: 'bananas', quantity: 0 }
与filter的区别: - 返回单个元素而非数组 - 找到即停止遍历
作用:原地排序数组元素
时间复杂度:O(n log n)(典型实现)
是否改变原数组:✅
const months = ['March', 'Jan', 'Feb'];
months.sort((a, b) => a.localeCompare(b));
console.log(months); // ["Feb", "Jan", "March"]
注意事项: - 默认将元素转换为字符串比较 - 比较函数应返回负数、0或正数
function multiplier(factor) {
return function(number) {
return number * factor;
};
}
const double = multiplier(2);
console.log(double(5)); // 10
function memoize(fn) {
const cache = {};
return function(...args) {
const key = JSON.stringify(args);
return cache[key] || (cache[key] = fn.apply(this, args));
};
}
function timingDecorator(fn) {
return function(...args) {
console.time('Execution Time');
const result = fn.apply(this, args);
console.timeEnd('Execution Time');
return result;
};
}
function conditional(predicate, trueFn, falseFn) {
return function(...args) {
return predicate.apply(this, args)
? trueFn.apply(this, args)
: falseFn.apply(this, args);
};
}
JavaScript 5提供的高阶函数构成了函数式编程的基础工具集,合理运用这些函数可以: - 显著提升代码质量 - 减少循环和临时变量 - 提高开发效率 - 增强代码的可测试性
建议开发者不仅要熟练使用内置高阶函数,还应掌握创建自定义高阶函数的技巧,这是进阶JavaScript开发的重要里程碑。
“Objects are data with methods. Closures are functions with data.” — John Resig “`
注:实际字数为约2500字,要达到4200字需要: 1. 扩展每个方法的示例和说明 2. 增加更多自定义高阶函数案例 3. 添加性能对比测试数据 4. 补充与其他编程语言的对比 5. 增加实际项目应用场景分析 需要扩展哪些部分可以具体说明。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。