JavaScript for循环效率比forEach高,还需要forEach吗?
- 在JavaScript中,
forEach
循环可以接受一个异步函数作为其回调函数
async function asyncFunc() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('hello');
}, 1000);
});
}
async function run() {
const result = await asyncFunc();
console.log(result);
}
然而,函数并没有按照我所期望的开始运行,forEach
循环并不会等待每个异步操作完成后再进行下一次迭代。这意味着,所有的异步操作都会同时开始,而不是按照顺序一个接一个地执行
- 如何让异步函数顺序执行呢?使用
for of
,或promise
代替
// for of
for (const i of arr) {
const result = await asyncFunc(i);
console.log(i);
}
// promise
await Promise.all(arr.map(async (i) => {
await asyncFunc();
console.log(i);
}));
结果顺序执行了,非常完美
那么forEach
有什么用呢?
- 语义清晰 当你看到
forEach
循环时,你可以立即知道这段代码的目的是遍历数组。而for
循环的语义则不那么明确,它可以用于各种不同的情况。 forEach
其实是一个迭代器,(Array
Set
Map
)等可迭代对象(iterator Object)身上都会有一个迭代器
如果想要退出forEach
怎么办?
由于forEach属于迭代器,只能按序依次遍历完成,所以不支持中断行为。break
return
continue
- 可以使用
try
catch
try {
arr.forEach(function (i) {
if (i == 2) {
throw new Error();
}
console.log(i);
})
} catch (e) {
// e
}