forEach回调的第三个参数的问题

Tenadolanter
  • 98
let arr = []
arr.forEach((item, index, _arr)=>{
    
})

我们都知道forEach回调方法接受三个参数item, index, _arr,但是最近有人问第三个参数的用法,我一脸懵逼,有用过的吗?烦请举个例子,不胜感谢。。。

评论
阅读 1.7k
4 个回答

其实想问题可以一步一步想
首先既然有了肯定有需求
为什么要用到这个参数或者在什么情况下会用到?
在不知道当前遍历操作的数组的情况下
什么情况下会不知道当前遍历的是什么数组?
封装的情况下
随便举例用到原数组的情况:

const arr = ['a', 'b', 'c']
arr.forEach((item, key) => {
    if(item === 'b') {
        arr[0] = 'a1'
    }
})

封装的情况:

function replace(item, key, arr){
    if(item === 'b') {
        arr[0] = 'a1'
    }
}
const arr = ['a', 'b', 'c']
arr.forEach(replace)

如果想不起来我会去菜鸟看一下,或者MDN。不止是forEach,几乎所有和遍历有关的数组方法,都是这么个参数结构(item, index, _arr) //当前元素,索引,源数组 ,reduce()方法又特别一些。

参数

描述

function(currentValue, index, arr)

必需。 数组中每个元素需要调用的函数。
函数参数:

参数

描述

currentValue

必需。当前元素

index

可选。当前元素的索引值。

arr

可选。当前元素所属的数组对象。

thisValue

可选。传递给函数的值一般用 "this" 值。
如果这个参数为空, "undefined" 会传递给 "this" 值

用处的话我倒是能想到一个,就是更快的查询到数组的引用。
如果你在回调中需要访问数组,而你又没有接受第三个参数,那么引擎需要向上层作用域查询是否存在变量,而如果你接受了第三个参数,那么相当于在当前作用域中就已经有这个变量了而不需要向上查询。这或许能算是一个好处吧,虽然可能微不足道。
还有的话可能跟程序的设计有关,比如你可能把回调定义在别的地方,但是回调中又希望访问数组,那么这时候以参数形式传递是最好的选择,不然数组就要定义在回调函数和forEach都能访问的作用域中比较局限。

撰写回答

登录后参与交流、获取后续更新提醒

宣传栏