在JavaScript中,forEach
方法和 for...of
循环都可以用于遍历数组(或类数组对象)中的元素。但是,它们在使用上有一些关键的区别:
for...of 循环
- 更多控制:for...of 循环提供了对循环的更多控制,包括使用 break, continue 和 return(如果在函数内部)来控制循环流程。
- 更广泛的适用性:除了数组之外,for...of 可以用来遍历任何实现了迭代协议的对象,包括字符串、Map、Set等。
- 异步迭代:for...of 循环可以与异步迭代(for await...of)结合使用,便于处理异步迭代对象,如异步生成器函数。
- 示例:
for (const link of myLinks) { link.onclick = (e) => { e.preventDefault(); const linkData = e.target.getAttribute("data-page"); getData(linkData); }; }
forEach 方法
- 针对数组设计:forEach 方法特定于数组,是 Array 的一个方法。它不适用于没有实现 forEach 方法的其他可迭代对象。
- 不能使用 break 和 continue:在 forEach 函数中不能使用 break 或 continue 来退出循环或跳过当前迭代。
- 回调函数的作用域:forEach 允许为回调函数指定一个可选的第二参数,用作回调函数内 this 的值。而在 for...of 循环中,通常通过闭包或外部变量来访问外部作用域。
- 无法直接使用异步操作:虽然在 forEach 的回调函数中可以执行异步操作,但是 forEach 本身不会等待这些异步操作完成。如果需要处理异步操作,可能需要使用 for...of 循环结合 async/await 或其他方法。
示例:myLinks.forEach((myLink) => { myLink.addEventListener("click", function(e) { e.preventDefault(); const linkData = e.target.getAttribute("data-page"); getData(linkData); }) });