forEach
语法:
注意:
- forEach调用时不会改变原数组,也就是调用它的数组
- forEach() 遍历的范围在第一次调用 callback 前就会确定。调用forEach后添加到数组中的项不会被 callback 访问到。如果已经存在的值被改变,则传递给 callback的值是 forEach()遍历到他们那一刻的值。已删除的项不会被遍历到。
- thisArg有值,当callback被调用时,this都会指向thisArg参数,如果被省略,或者thisArg的值为null或者undefined,this指向全局对象。
说明:1,2
即:arr长度最后影响不了执行的次数(如果能影响arr[0]
应该为6而不是3)说明在调用callback之前已经调用了它的数组的长度。item的更改影响不到原数组arr,即它的数组的值已被浅拷贝或深拷贝
验证:里面是深拷贝还是浅拷贝
即:浅拷贝
验证:回调函数的第三个参数为它的数组
手写forEach:
扩展(for与forEach的区别)
由手写forEach的可知,forEach是不能被break打断的,如果在里面添加break
forEach里面使用return没有返回值,手写里面只是调用回调函数。在for里面使用return会直接报错
Array.prototype.map()
map()方法创建一个新数组,其结果是该数组中的每个元素是调用一次提供的函数后的返回值。
语法:
callback三个参数:1.当前值。2.当前索引(可选)3.当前数组(可选)
thisArg:callback的this指向
注意:
- map方法会给原数组的每个元素按顺序调用一次,每次执行后的返回值(包括undefined)组成一个新数组。callback函数只会在有值的索引上被调用,那些从来没被赋过值或者使用 delete 删除的索引则不会被调用。
- map不会修改原数组的本身,但可以在回调函数执行时改变原数组
- map处理数组元素的次数在回调函数第一次调用时候已经决定。存在的数组元素改变了,传给callback的值是map访问该元素时的值。在map函数调用后但在访问该元素前,该元素被删除的话,则无法被访问到。
实现:
Array.prototype.reduce()
reduce()该方法对数组中的每个元素执行一个由您提供的函数(升序执行),将其结果汇总为单个返回值。
语法:
callback包含四个参数:accumulator为上一次回调返回的累积值,currentValue数组当前元素,index当前索引,array为调用reduce的数组
initialValue:作为第一次调用回调函数的累积值。如果没有则将使用数组第一个元素。没有initialValue在没有初始值的空数组上调用 reduce 将报错。
注意:
- initialValue有值,那么第一次回调执行时,accumulator取值为initialValue,currentValue取值为数组第一个值。initialValue没有提供,那么第一次回调执行时,accumulator取值为数组第一个值。,currentValue取值为数组第二个值。
- 调用reduce的数组为空,报错。数组只有一个元素且没有提供initialValue,或者提供initialValue但是空数组[],那么此唯一值将被返回并且
callback
不会被执行。
由此得知:非空数组调用reduce,在没有传入initialValue值时,那么累积值accumulator就会在调用数组找到第一个非空empty值,cur就是该数组下一个值(没有下一个值,就直接将accumulator返回),进行第一次的回调函数。
实现:
创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
语法:
注意:
- callback只会在已经赋值的索引上调用,对于那些已经被删除或者从未赋值的索引不会被调用
- filter不会改变原数组,它返回过滤后的新数组
- filter的遍历范围在第一次调用callback之前已经被确定。
实现: