js Array 方法 find、findIndex、filter、some、every、map、forEach、reduce、reduceRight的 区别

1.find() 方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined

arr.find(callback[, thisArg])
注意 callback 函数会为数组中的每个索引调用即从 到 length - 1,而不仅仅是那些被赋值的索引,这意味着对于稀疏数组来说,
该方法的效率要低于那些只遍历有值的索引的方法。
find方法不会改变数组。
在第一次调用 callback函数时会确定元素的索引范围,因此在 find方法开始执行之后添加到数组的新元素将不会被 callback函数访问到。
如果数组中一个尚未被callback函数访问到的元素的值被callback函数所改变,那么当callback函数访问到它时,它的值是将是根据它在数组中的索引所访问到的当前值。
被删除的元素仍旧会被访问到,但是其值已经是undefined了。

2.findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引。若没有找到对应元素则返回-1。

arr.findIndex(callback[, thisArg])
参考find()

3.filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。 (返回 true 表示该元素通过测试,保留该元素,false 则不保留。)

var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])
注意 filter 为数组中的每个元素调用一次 callback 函数,并利用所有使得 callback 返回 true 或等价于 true 的值的元素创建一个新数组。
callback 只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用。
那些没有通过 callback 测试的元素会被跳过,不会被包含在新数组中。
filter 遍历的元素范围在第一次调用 callback 之前就已经确定了。在调用 filter 之后被添加到数组中的元素不会被 filter 遍历到。
如果已经存在的元素被改变了,则他们传入 callback 的值是 filter 遍历到它们那一刻的值。被删除或从来未被赋值的元素不会被遍历到。

4.some() 方法测试数组中是不是至少有1个元素通过了被提供的函数测试。它返回的是一个Boolean类型的值。

  注意:如果用一个空数组进行测试,在任何情况下它返回的都是false

arr.some(callback(element[, index[, array]])[, thisArg])
返回值: 数组中有至少一个元素通过回调函数的测试就会返回true;所有元素都没有通过回调函数的测试返回值才会为false。
some() 为数组中的每一个元素执行一次 callback 函数,直到找到一个使得 callback 返回一个“真值”(即可转换为布尔值 true 的值)。
如果找到了这样一个值,some() 将会立即返回 true。否则,some() 返回 false。callback 只会在那些”有值“的索引上被调用,
不会在那些被删除或从来未被赋值的索引上调用。
some() 遍历的元素的范围在第一次调用 callback. 前就已经确定了。在调用 some() 后被添加到数组中的值不会被 callback 访问到。
如果数组中存在且还未被访问到的元素被 callback 改变了,则其传递给 callback 的值是 some() 访问到它那一刻的值。已经被删除的元素不会被访问到。

5.every() 方法测试一个数组内的所有元素是否都能通过某个指定函数的测试。它返回一个布尔值。

注意:如果用一个空数组进行测试,在任何情况下它返回的都是true。
arr.every(callback(element[, index[, array]])[, thisArg])
返回值: 如果回调函数的每一次返回都为 truthy 值,返回 true ,否则返回 false
every 方法为数组中的每个元素执行一次 callback 函数,直到它找到一个会使 callback 返回 falsy 的元素。
如果发现了一个这样的元素,every 方法将会立即返回 false。否则,callback 为每一个元素返回 trueevery 就会返回 true
callback 只会为那些已经被赋值的索引调用。不会为那些被删除或从未被赋值的索引调用。

every 不会改变原数组。
every 遍历的元素范围在第一次调用 callback 之前就已确定了。在调用 every 之后添加到数组中的元素不会被 callback 访问到。

如果数组中存在的元素被更改,则他们传入 callback 的值是 every 访问到他们那一刻的值。
那些被删除的元素或从来未被赋值的元素将不会被访问到。

6.map() 方法创建一个新数组,其结果是该数组中的每个元素是调用一次提供的函数后的返回值。

var new_array = arr.map(function callback(currentValue[, index[, array]]) {
 // Return element for new_array 
}[, thisArg])
callback 函数只会在有值的索引上被调用;那些从来没被赋过值或者使用 delete 删除的索引则不会被调用。
如果被map调用的数组是离散的,新数组将也是离散的保持相同的索引为空。
返回一个由原数组每个元素执行回调函数的结果组成的新数组。

7.forEach() 方法对数组的每个元素执行一次给定的函数。

注意:如果用一个空数组进行测试,在任何情况下它返回的都是true。
arr.forEach(callback(currentValue [, index [, array]])[, thisArg])
返回值: undefined。
forEach() 方法按升序为数组中含有效值的每一项执行一次 callback 函数,那些已删除或者未初始化的项将被跳过(例如在稀疏数组上)。

forEach() 遍历的范围在第一次调用 callback 前就会确定。调用 forEach 后添加到数组中的项不会被 callback 访问到。
如果已经存在的值被改变,则传递给 callback 的值是 forEach() 遍历到他们那一刻的值。已删除的项不会被遍历到。
如果已访问的元素在迭代时被删除了(例如使用 shift()),之后的元素将被跳过——参见下面的示例。

forEach() 为每个数组元素执行一次 callback 函数;与 map() 或者 reduce() 不同的是,它总是返回 undefined 值,
并且不可链式调用。其典型用例是在一个调用链的最后执行副作用(side effects,函数式编程上,指函数进行 返回结果值 以外的操作)。

forEach() 被调用时,不会改变原数组,也就是调用它的数组(尽管 callback 函数在被调用时可能会改变原数组)。
(译注:此处说法可能不够明确,具体可参考EMCA语言规范:
'forEach does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.',
即 forEach 不会直接改变调用它的对象,但是那个对象可能会被 callback 函数改变。)  
注意: 除了抛出异常以外,没有办法中止或跳出 forEach() 循环。如果你需要中止或跳出循环,forEach() 方法不是应当使用的工具。
若你需要提前终止循环,你可以使用:

  这些数组方法则可以对数组元素判断,以便确定是否需要继续遍历:

  注:只要条件允许,也可以使用 filter() 提前过滤出需要遍历的部分,再用 forEach() 处理。

 8.reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),(从将其结果汇总为单个返回值。

  reducer 函数接收4个参数:

  1. Accumulator (acc) (累计器)
  2. Current Value (cur) (当前值)
  3. Current Index (idx) (当前索引)
  4. Source Array (src) (源数组)

  您的 reducer 函数的返回值分配给累计器,该返回值在数组的每个迭代中被记住,并最后成为最终的单个结果值。

  arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])

注意:如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。
1).如果数组为空且没有提供initialValue,会抛出TypeError 。
2).如果数组仅有一个元素(无论位置如何)并且没有提供initialValue, 或者有提供initialValue但是数组为空,那么此唯一值将被返回并且callback不会被执行。

 9.reduceRight() 方法接受一个函数作为累加器(accumulator)和数组的每个值(从右到左)将其减少为单个值。

  reducer 函数接收4个参数:

  1. Accumulator (acc) (累计器)
  2. Current Value (cur) (当前值)
  3. Current Index (idx) (当前索引)
  4. Source Array (src) (源数组)

  您的 reducer 函数的返回值分配给累计器,该返回值在数组的每个迭代中被记住,并最后成为最终的单个结果值。

  arr.reduceRight(callback(accumulator, currentValue[, index[, array]])[, initialValue])

注意:如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。
1).如果数组为空且没有提供initialValue,会抛出TypeError 。
2).如果数组仅有一个元素(无论位置如何)并且没有提供initialValue, 或者有提供initialValue但是数组为空,那么此唯一值将被返回并且callback不会被执行。
方法

参数1

callBack

参数2

返回值

提前

结束

未赋值索引
未被访问
callback
改变
未被访问被
callback
删除 
 find
element[,index[,array]]
[,thisArg]
第一个元素的值OR undefined

当前值

值是undefined 
 findIndex
element[,index[,array]]
[,thisArg]
第一个元素的索引 OR -1
 会

值是undefined 
 filter
element[,index[,array]]
[,thisArg]

通过测试的所有元素

(true保留,false 不保留)

不会
不会
some
element[,index[,array]]
[,thisArg]
至少一个元素通过测试返回true
所有元素都没通过测试返回false
不会
不会
every
element[,index[,array]]
[,thisArg]
每一次返回都为 truthy 值,
返回 true 
否则返回 false
不会
不会
 map
curVal[,index[,array]]
[,thisArg]
 
由原数组每个元素执行回调函数
的结果组成的新数组
 
否 
不会
不会
forEach
curVal[,index[,array]]
[,thisArg]
undefined
不会
不会
reduce accumulator, currentValue[, index[, array]]  [,initialValue]  返回值分配给累计器,该返回值在数组的每个迭代中被记住,并最后成为最终的单个结果值   否  
不会
 
不会 
reduceRight accumulator, currentValue[, index[, array]]  [,initialValue] 返回值分配给累计器,该返回值在数组的每个迭代中被记住,并最后成为最终的单个结果值   否
不会
 
 
不会 

 

 


 


 

posted @ 2021-05-31 15:25  尖子  阅读(1112)  评论(0编辑  收藏  举报