研究数组迭代方法:稀疏数组处理、多种遍历方式

数组迭代方法的研究
我们知道数组存在一些迭代方法将会遍历数组,在这篇文章中主要研究一些这些方法的相关问题,比如说稀疏数组处理方法、如何打断、方法内异常处理等等。
稀疏数组处理方法
不同的迭代方法在处理稀疏数组的时候存在不同的方式,在 MDN 中指出,在旧的迭代方法中处理空槽的方式与处理包含 undefined 索引的方式不同,而在新的迭代方法中不会对空槽进行特殊处理,而是将它们视为包含 undefined。
在旧的方法中对空槽的方式是 “诸如 forEach 之类的迭代方法根本不会访问空槽。其他方法,如 concat 、copyWithin 等,在进行复制时会保留空槽,因此最终数组依然是稀疏的。”
以下数组对数组进行了特殊处理 concat()、copyWithin()、every()、filter()、flat()、flatMap()、forEach()、indexOf()、lastIndexOf()、map()、reduce()、reduceRight()、reverse()、slice()、some()、sort() 和 splice()。
不对空槽进行特殊处理的方法,将其视为 undifined 的方法有:entries()、fill()、find()、findIndex()、findLast()、findLastIndex()、includes()、join()、keys()、toLocaleString()、values() 和 with()。
引用
数组迭代方法的打断方式
如果需要在数组迭代时需要灵活的中断迭代,通常建议使用传统的
for循环或 for...of循环,这样可以更直接地使用 break来中断循环。
当然我们也可以研究一些常见方法的打断方式,比如说,我们在方法外设置一个变量 isBreak 作为判断是否是否需要打断的依据,在需要打断的地方将 isBreak 设置为 true,当然我们需要在方法的前面放一段特殊的代码。整体代码如下:
1 | let isBreak; |
在这个例子中,isBreak 用于控制循环是否继续。当遇到 item === 3 时,我们将 isBreak 设置为 true,从而在下次迭代时跳过后续的逻辑。
当然也有一些方法自带打断,例如:
- some 会在存在一个元素符合测试函数时,停止遍历,并且返回 true;
- every 会在存在一个元素不符合测试函数是,停止遍历,并且返回 false;
- find 和 findIndex 会在找到第一个符合的元素时,停止遍历,并且返回值或者索引;
数组迭代方法的异常处理
在数组迭代方法的异常处理中通常需要思考的问题主要是,出现异常是否继续执行接下来的迭代,如果需要执行接下来的迭代通常是将 try-catch 防止方法内,如果出现了异常将不需要迭代剩下的元素,就需要将 try-catch 放在方法外。
1 | let arr = [1, 2, 3, 4, 5]; |
在上面的代码中,假设在 item===3 的时候出现了一个不是很严重的问题,后续代码可以继续执行。
1 | let arr = [1, 2, 3, 4, 5]; |