三、数组拓展
3.1 判断数组
1 | <div>1</div> |
3.1.1 第一种 判断实例化对象
obj instanceof Array
1 | // 第一种 instanceof 判断实例化对象 |
3.1.2 第二种 判断构造函数是否是Array
obj.constructor === Array
1 | //第二种 constructor 判断构造函数 |
3.1.3 第三种 判断对象的类型是否是数组
Object.prototype.toString.call(obj)
1 | // 第三种 toString 判断对象类型是不是数组 call()执行函数并改变this指向 |
3.1.4 第四种 数组的静态方法
Array.isArray(obj)
1 | // 第四种 数组的静态方法 |
3.2 获取成员的索引值
3.2.1 indexOf, lastIndexOf
ES5为数组拓展了两个方法:indexOf, lastIndexOf,分别用于获取数组中成员的索引值
参数就是要查找的成员
返回值就是成员的索引值
- 如果没有找到成员,则返回-1(和字符串的indexOf方法类似)
在查找成员的时候,不会做数据的类型转换,是真正的全等查找
1 | // 定义一个数组 |
在查找成员的时候,不会做数据的类型转换,是真正的全等查找
1 | // // 定义一个数组 |
3.2.2 实现indexOf方法
1 | /** |
3.2.3 兼容IE8 实现indexOf方法
1 | // 兼容 IE8 |
3.2.4 兼容IE8 实现lastIndexOf方法
1 | // 兼容IE8 实现lastIndexOf方法 |
3.3 forEach
3.3.1 forEach 使用方式
该方法用于替代for循环,是数组的迭代器方法,并没有将for循环移除,只是将循环封装在了数组迭代器方法forEach中。
使用方式:
数组.forEach(fn);
fn:要执行的函数
有三个参数:
第一个参数:成员值
第二个参数:索引值
第三个参数:原数组
作用域:window
函数的返回值对forEach的执行结果时没有影响的
forEach方法的返回值始终是undefined
1 | // 定义一个数组 |
3.3.2 forEach方法 实现数组的迭代器方法
1 | /** |
3.3.3 兼容IE8 实现forEach方法
1 | // 兼容 IE8 |
3.3.4 jquery中的forEach方法
jquery中也有一个类似的方法,each方法,与forEach方法的区别是:
在jquery中的each方法,第一个参数是索引值,第二个参数是成员值
3.3.5 for循环的弊端
1 | // 测试for循环 |
3.4 map
3.4.1 map方法使用方式
该方法用于遍历数组并映射结果,与forEach方法类似,只是它的返回值是有意义的
参数是要执行的函数
函数中有3个参数:成员值, 索引值, 原数组
作用域是 window
返回值就是执行结果的数组成员
map方法的返回值是一个新的数组,数组中的成员就是每一次函数执行的结果的成员
1 | // 定义一个数组 |
返回值是有意义的:
1 | var result = arr.map(function(value, index, arr){ |
3.4.2 实现map方法 用于遍历数组并映射结果
1 | /** |
3.4.3 兼容IE8 实现map方法
1 | // 兼容 IE8 |
3.5 fill
3.5.1 fill方法使用方式
该方法用于填充数组中的成员
我们在使用new Array(len)
或者 Array(len)
来创建数组的时候,得到的只有长度没有成员,所以我们不能使用数组的迭代器方法(forEach, map),而是需要填充数组
参数就是需要填充的成员
如果参数为函数,也不会执行该函数
1 | // 创建数组 创键长度为 5 的数组 |
此时,就需要填充数组:
1 | // 创建数组 创键长度为 5 的数组 |
如果参数为函数,也不会执行该函数:
1 | // 创建数组 创键长度为 5 的数组 |
3.5.2 实现fill方法
1 | /** |
3.5.3 兼容IE8 实现fill填充方法
1 | // 兼容IE8 |
3.6 断言方法 some
3.6.1 some方法使用方式
数组中是否有成员满足条件
使用方式和forEach类似
参数就是要执行的函数
有三个参数:成员值, 索引值, 原数组
函数的返回值就是判断的依据
some方法的返回值:
true:
至少有一个成员满足条件false:
都不满足条件
1 | // 定义一个数组 |
some方法对true极其敏感,一旦有条件,立即停止遍历:
1 | // 定义一个数组 |
3.6.2 实现some方法
1 | /** |
3.6.3 兼容IE8
1 | // 兼容IE8 |
3.7 断言方法 every
3.7.1 every方法使用方式
数组中是否都满足条件
使用方式与forEach类似
参数就是要执行的函数
函数中有三个参数:成员值, 索引值, 原数组
函数的返回值就是判断的依据
every方法的返回值:
true:全部满足条件
false:有成员不满足条件
every对false敏感,一旦遇到一个不满足条件的,就会立即停止遍历
1 | // 定义一个数组 |
1 | var result = arr.every(function(value, index, arr){ |
1 | var result = arr.every(function(value, index, arr){ |
1 | // 定义一个数组 |
3.7.2 实现every方法
1 | /** |
3.7.3 兼容IE8
1 | // 兼容IE8 |
3.8 filter
3.8.1 filter方法的使用方式
实现对数组的过滤
使用方式和forEach方法类似
参数就是要执行的函数
函数中有三个参数:成员值, 索引值, 原数组
函数的返回值就是过滤的条件
filter方法的返回值就是满足过滤条件的成员组成的新数组
1 | // 定义一个数组 |
3.8.2 实现filter方法
1 | /** |
3.8.3 兼容IE8
1 | // 兼容IE8 |
3.9 reduce 累加方法
3.10 reduceRight
3.10.1 reduce 和reduceRight方法使用方式
这两个是累加的方法,reduce是从前向后累加,而reduceRight是从后向前累加
对所有成员逐一处理,并将结果返回
参数就是要执行的函数
有四个参数:上一次的累积结果,当前成员值,当前索引值,原数组
函数的返回值就是当次累积的结果,将会在下一次遍历的时候作为第一个参数传递
reduce是从第二个成员开始遍历,第一个成员会在第一次开始遍历的时候作为第一个参数传递
reduceRight是从倒数第二个成员开始遍历,倒数第一个成员在第一次遍历的时候作为第一个参数传递
reduce 累加:
1 | // 定义数组 |
reduce 累积:
1 | // 定义数组 |
reduceRight 累加:
1 | // 定义数组 |
reduceRight 累积:
1 | // 定义数组 |
3.10.2 实现reduce方法
1 | /** |
3.10.3 兼容IE8 实现reduce方法
1 | // 兼容IE8 实现reduce方法 |
3.10.4 实现reduceRight方法
1 | /** |
3.10.5 兼容IE8 实现reduceRight方法
1 | // 兼容IE8 实现reduceRight方法 |
3.11 addNum
实现addNum(num1, num2)方法,接收两个参数,分别是两个整数,求两个整数之间的所有整数之和
addNum(1, 100)
可以包含两个参数,可以不包含两个参数
我们统一为包含两个参数,即1~100之和
1 | // 定义方法 |