在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);
    })
    });

Leave a reply

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

required