Array.prototype.filter
是 JavaScript 中常用的数组方法之一,它可以根据指定的条件来筛选出符合条件的数组元素并返回一个新的数组。在 ES10 中,Array.prototype.filter
方法进行了一些改进,但是在使用过程中还是容易出现一些坑,本文将为大家提供一些防坑指南。
ES10 中的 Array.prototype.filter 方法
ES10 中,Array.prototype.filter
方法新增了一个可选参数 thisArg
,用于指定回调函数中的 this
值。当然,这并不是本文的重点。
我们重点关注的是新增了一个 for...of
循环遍历方式。在 ES10 之前,Array.prototype.filter
方法内部是使用 for
循环遍历数组的,而在 ES10 中,如果浏览器支持 for...of
循环,Array.prototype.filter
方法将使用 for...of
循环遍历数组。这个改变看起来很小,但是实际上却有着巨大的影响。
问题来了
我们来看下面这个例子:
const arr = [1, 2, 3, 4, 5]; const filteredArr = arr.filter(item => { console.log(item); return item > 2; });
在 ES10 之前,Array.prototype.filter
方法内部是使用 for
循环遍历数组的。因此,在上面的例子中,控制台将会输出:
1 2 3 4 5
在每次循环的时候都会输出数组中的元素。
而在 ES10 中,Array.prototype.filter
方法内部使用 for...of
循环遍历数组。因此,在上面的例子中,控制台将会输出:
3 4 5
只有符合条件的元素才会被输出。这个改变看起来很小,但是实际上却有着巨大的影响。
如何避免坑
当我们在使用 Array.prototype.filter
方法的时候,需要注意以下几点:
- 回调函数中不要依赖循环索引值
在 for...of
循环中,我们无法获取到循环索引值,因此在回调函数中不要依赖循环索引值。
例如,下面这个例子就是错误的:
const arr = [1, 2, 3, 4, 5]; const filteredArr = arr.filter((item, index) => { console.log(index); return item > 2; });
在 ES10 中,控制台将不会输出任何东西。
- 回调函数中不要对原数组进行修改
在 Array.prototype.filter
方法中,我们不应该对原数组进行修改,因为这可能会导致意想不到的结果。
例如,下面这个例子就是错误的:
// javascriptcn.com 代码示例 const arr = [1, 2, 3, 4, 5]; const filteredArr = arr.filter(item => { arr.push(item + 5); return item > 2; }); console.log(filteredArr); // [3, 4, 5] console.log(arr); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
在 ES10 中,Array.prototype.filter
方法内部使用 for...of
循环遍历数组,因此在上面的例子中,arr
数组会被修改,导致意想不到的结果。
- 回调函数中不要返回 undefined
在 Array.prototype.filter
方法中,我们不应该返回 undefined
,因为这可能会导致意想不到的结果。
例如,下面这个例子就是错误的:
// javascriptcn.com 代码示例 const arr = [1, 2, 3, 4, 5]; const filteredArr = arr.filter(item => { if (item > 2) { return; } return item; }); console.log(filteredArr); // [1, 2, undefined]
在 ES10 中,Array.prototype.filter
方法内部使用 for...of
循环遍历数组,因此在上面的例子中,undefined
也会被添加到新的数组中。
总结
ES10 中的 Array.prototype.filter
方法新增了一个 for...of
循环遍历方式,从而导致了一些使用上的坑。在使用 Array.prototype.filter
方法的时候,我们需要注意回调函数中不要依赖循环索引值、不要对原数组进行修改、不要返回 undefined
等问题。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6581a5aad2f5e1655dce302f