本文是 重温基础 系列文章的第二十一篇。
今日感觉:想家。 前端
本人本身整理的【Cute-JavaScript】资料,包含:【ES6/ES7/ES8/ES9】,【JavaScript基础(初级/中级/高级)】以及后面会添加的【JS面试题】三个系列。
欢迎您的支持! git
系列目录:github
本章节复习的是JS中的高阶函数,能够提升咱们的开发效率。面试
我的简单理解为,一个函数能够接收其余函数做为参数,这种函数便称为高阶函数,而主要目的就是为了能接收其余函数做为参数。segmentfault
Q: 为何能够接收一个函数做为参数?
A: 由于函数能够接收变量做为参数,而变量能够声明一个方法。
简单实例:数组
function a (x){ return 'hi ' + x; } function f (a, b){ return a(b); } f(a, 'leo'); // "hi leo"
这段代码的意思:定义方法f
,接收两个参数,方法a
和变量b
,在方法a
中返回一段字符串,当执行方法f
并传入参数方法a
和参数b
的时候,返回"hi leo"
。 微信
也能够直接调用JS内置方法:闭包
let a = 3, b = -2; function my_abs (val, fun){ return fun(val); } my_abs(a, Math.abs); // 3 my_abs(b, Math.abs); // 2
map()
方法的做用是:接收一个函数做为参数,对数组中每一个元素按顺序调用一次传入的函数并返回结果,不改变原数组,返回一个新数组。
一般使用方式:arr.map(callback())
,更多详细介绍能够参考 MDN Array.map()。
参数:函数
arr
: 须要操做的数组;callback(currentValue, index, array, thisArg)
: 处理的方法,四个参数;post
currentValue
当前处理的元素的值 index
当前处理的元素的索引,可选array
调用map()
方法的数组,可选currentVthisArgalue
执行 callback
函数时使用的 this
值,可选返回值:
返回一个处理后的新数组。
实例:
let arr = [1, 3, -5]; let a1 = arr.map(Math.abs); // a1 => [1, 3, 5]; let a2 = arr.map(String); // a2 => ["1", "3", "-5"] let a3 = arr.map(function (x){ return x + 1; }) // 等价于 a3=arr.map(x => x+1) // a3 => [2, 4, -4]
对比 for...in
循环,map()
书写起来更加简洁:
let arr = [1, 3, -5]; let a1 = []; for (var i=0; i<arr.length; i++){ a1.push(arr[i] + 1); } // a1 => [2, 4, -4]
map()
做为高阶函数,事实上它把运算规则抽象了。
reduce()
方法的做用是:接收一个函数,对数组进行累加操做,把累计结果和下一个值进行操做,最后返回最终的单个结果值。
一般使用方式:arr.reduce(callback(), initValue)
,更多详细介绍能够参考 MDN Array.reduce()
参数:
callback(returnValue, currentValue, currentIndex, array)
: 累记器的方法,四个参数:
returnValue
上一次处理的返回值,或者初始值currentValue
当前处理的元素的值,可选currentIndex
当前处理的元素的索引,可选array
调用reduce()
方法的数组,可选initValue
初次调用callback()
时候returnValue
参数的初始值,默认数组第一个元素,可选返回值:
返回一个最终的累计值。
实例:
let arr = [1, 3, -5]; let sum1 = arr.reduce((res, cur) => res + cur); // sum1 => -1 let sum2 = arr.reduce((res, cur) => res + cur , 1); // sum1 => 0
let arr = [[1, 2], [3, 4], [5, 6]]; let con = arr.reduce((res, cur) => res.concat(cur)); // con => [1, 2, 3, 4, 5, 6]
filter()
方法的做用是:接收一个函数,依次做用数组每一个元素,并过滤符合函数条件的元素,将剩下的数组做为一个新数组返回。
一般使用方式:arr.filter(callback(), thisArg)
,更多详细介绍能够参考 MDN Array.filter()
参数:
callback(ele, index, array)
: 过滤条件的方法,当返回true
则保存该元素,反之不保留,三个参数:
ele
当前处理的元素index
当前处理的元素的索引,可选array
调用filter()
方法的数组,可选thisArg
执行 callback
时的用于 this
的值,可选返回值:
返回一个过滤剩下的元素组成的新数组。
实例:
let arr = [1, 2, 3, 4, 5, 6]; let res = arr.filter(x => x % 2 != 0); // res => [1, 3, 5]
let arr = [1, 2, 3, 4, 5, 6]; let res = arr.filter(x => x > 3); // res => [4, 5, 6]
let arr = ['a', '', null, undefined, 'b', '']; let tri = arr.filter(x => x && x.trim()); // tri => ["a", "b"]
总结下: filter()
主要做为筛选功能,所以核心就是正确实现一个“筛选”函数。
sort()
方法的做用是:接收一个函数,对数组的元素进行排序,并返回排序后的新数组。默认排序顺序是根据字符串Unicode码点。
一般使用方式:arr.sort(fun())
,更多详细介绍能够参考 MDN Array.sort()
compareFunction 可选
用来指定按某种顺序进行排列的函数。若是省略,元素按照转换为的字符串的各个字符的Unicode位点进行排序。
参数:
fun(a, b)
: 指定按某种顺序进行排列的函数,若省略则按照转换为的字符串的各个字符的Unicode位点进行排序,两个可选参数:fun()
返回 a
和b
两个值的大小的比较结果,sort()
根据返回结果进行排序:
fun(a, b)
小于 0 ,则 a
排在 b
前面;fun(a, b)
等于 0 ,则 a
b
位置不变;fun(a, b)
大于 0 ,则 a
排在 b
后面;返回值:
返回排序后的新数组,并修改原数组。
实例:
let arr = [1,5,2,3]; let sort1 = arr.sort(); // 等同于 let sort1 = arr.sort((a, b) => a - b); // sort1 => [1, 2, 3, 5] let sort2 = arr.sort((a, b) => b - a); // sort2 => [5, 3, 2, 1]
let arr1 = ['AA', 'CC', 'BB']; let sort1 = arr1.sort(); // sort1 => ["AA", "BB", "CC"] let arr2 = ['AA', 'aa', 'BB']; let sort2 = arr2.sort(); // sort2 => ["AA", "BB", "aa"] let arr3 = ['AA', 'aa', 'BB']; let sort3 = arr3.sort((a, b) => a.toLowerCase() > b.toLowerCase()); // sort3 => ["AA", "aa", "BB"] // 也能够写成: let sort3 = arr3.sort((a, b) => { let s1 = a.toLowerCase(); let s2 = b.toLowerCase(); return s1 > s2 ? 1 : s1 < s2 ? -1 : 0; })
总结下: sort()
主要做为排序功能,所以核心就是正确实现一个“排序”函数。
Author | 王平安 |
---|---|
pingan8787@qq.com | |
博 客 | www.pingan8787.com |
微 信 | pingan8787 |
每日文章推荐 | https://github.com/pingan8787... |
JS小册 | js.pingan8787.com |
欢迎关注微信公众号【前端自习课】天天早晨,与您一块儿学习一篇优秀的前端技术博文 .