前言
一直以来想写一篇关于es5中新增数组的使用方法与源码实现的文章,拖了挺久了,趁着这夜深人静,大脑清醒,又困意不在的时刻写下来。也许有人会问,现如今es6都大行其道了,还学es5是不是有些过时了,😄,温故而知新,可以为师矣,而且我们是要自己实现这些方法嘛,知其然还要知其所以然,不光要会用,还要知道为什么是这样用哒。
新增方法预览
es5中给js的数组增添了许多实用的方法,利用这些方法可以帮助我们更加快速方便的写js代码,然后蛋疼的是低版本ie肯定是不支持的,所以………………自己动手丰衣足食。让我们一步步看下如何使用与实现这些方法。
- forEach
- map
- filter
- some
- every
- indexOf
- lastIndexOf
- reduce
- reduceRight
forEach
这个方法作用是啥咧,就是循环,遍历。比如一般我们在for循环做这样的事的时候如下。
|
|
如果用forEach我们应该如何做呢?
|
|
是不是觉得不用写for循环了,瞬间逼格都高了
forEach函数中的回调函数支持三个参数,
1、数组的值
,2、值的索引
,3、数组本身
。这样的调用方式是不是和jQuery中的$.each很像? 其实不然,jQuery和forEach回调函数的第一个和第二个参数正好是反着来的。
看看对比
|
|
接着我们来看一下forEach的第二个参数,这个参数决定第一个回调函数的内部this指向
|
|
最后接下来我们自己实现一下这个方法
|
|
map
map是干嘛的! 其最主要的作用就是将原数组按照一定的规则映射成一个新的数组。再将其返回,
注意是返回一个新的数组,而不是将原数组直接改变
使用方式和forEach类似,也是接受一个回调函数,一个改变内部this指向的对象。
map
|
|
callback
|
|
举个栗子
|
|
注意上面的return,如果我们不写return会怎样呢?
|
|
这一堆的undefined是啥情况,还记得一个函数执行完,如果没有显示的返回值,会返回什么吗? 没错 就是undefined
,这就是原因所在,等会通过源码,你就会更加明白。
最后我们自己实现一下map这个方法
|
|
filter
接下来是
filter
,筛选,过滤的意思,给你一个数组,用一些你制定的条件,对其中的值进行过滤,最后得到你想要的新的数组。基本用法和map差不多
|
|
当然最后还有第二个参数改变内部this指向的参数可选,默认是window对象,你也可以传一个对象进去, 最后我们自己来实现一下这个api
|
|
some vs every
some与接下里的every正好相对,
some
是只要数组中的某个值,符合你给定的判断条件就返回true,而every
则是数组中的所有值都符合你给定的判断条件的时候才会返回true,否则就返回false,也就是说两个方法最后得到的都是true or false
举个栗子
|
|
some 和 every使用起来非常简单,接下来我们自己实现一把
|
|
indexOf
数组的indexOf方法和字符串的indexOf用法非常类似,
array.indexOf(searchElement[, fromIndex])
,针对给定的要查找的值,和开始查找的位置(可选),返回整数索引值。
举个例子
|
|
实现代码
|
|
lastIndexOf
数组的lastIndexOf方法和字符串的lastIndexOf用法非常类似,
array. lastIndexOf(searchElement[, fromIndex])
,针对给定的要查找的值,和开始查找的位置(可选),返回整数索引值。与indexOf不同的地方在于,它是从后往前查找。默认开始查找的位置是array.length - 1
举个栗子
|
|
源码实现
|
|
reduce
reduce 相对es5中数添加的其他方法都复杂一些,我们可以通过栗子来看一下这个api怎么使用。首先基本参数如下
array.reduce(callback[, initialValue])
,接收一个回调函数,一个初始化的值initialValue
。其中callback参数分别是初始化的值initialValue
,如果没有传入initialValue
,则默认是数组的第一项。第二个及其后面的参数分别是当前值
,索引
,数组本身
|
|
我们来看一下上面的执行过程是怎样的。
第一回合
|
|
第二回合
|
|
第三回合
|
|
第四回合
|
|
第五回合
|
|
最后得到结果15
那么我们如何自己实现一个reduce呢?
|
|
reduceRight
reduceRight基本用法与reduce类似,好比indexOf与lastIndexOf,不同之处在于它是从最右边的值开始计算的。我们直接去看源码怎么实现吧
|
|
结尾
终于写完了,断断续续快写了两天,欢迎大家看了以后提一些意见,函数实现的不一定都对,肯定有一些问题的地方,欢迎大家指正。
最后把代码放到github上面了
各位大大,请让我打个小广告。😄😄😄