解决 ECMAScript 2019 中 for...of 循环中的 break 和 continue 语句问题

阅读时长 7 分钟读完

ECMAScript 2019 中新增了 for...of 循环语句来遍历数组、字符串、Set、Map、TypedArray 等可迭代对象,可以方便地完成迭代功能。但是,在使用 for...of 循环时,我们可能会遇到 break 和 continue 语句不能正常工作的问题。本文将详细介绍该问题的原因以及解决方法,并提供示例代码,帮助前端开发者快速掌握该知识点。

问题原因

在 for...of 循环中,如果使用 break 或 continue 语句,会发现运行结果与其他类型的循环语句有所不同。具体来说,使用 break 或 continue 语句时,无法在循环内部完成跳出循环或跳过一次循环的操作。例如:

以上代码将输出 "finished",而不是预期中的仅输出 1。这是因为 for...of 循环是基于迭代器的,每次循环都会调用一次 next() 方法获取下一个元素。在使用 break 或 continue 语句时,会导致 next() 方法无法正确执行,从而影响循环的执行。因此,需要针对该问题进行特殊处理,才能顺利完成跳出循环或跳过一次循环的操作。

解决方法

为了解决 for...of 循环中的 break 和 continue 语句问题,我们可以通过以下两种方式来实现。

方式一:使用某些开发框架或工具

很多开发框架或工具已经实现了针对该问题的特殊处理,在使用 for...of 循环时可以直接使用 break 和 continue 语句来完成跳出循环和跳过一次循环的操作,无需进行其他特殊处理。例如,Angualr 框架的 @angular/core 包中提供了 NgForOf 指令,可以在 for...of 循环中直接使用 break 和 continue 语句。示例如下:

-- -------------------- ---- -------
------ - --------- - ---- ----------------

------------
  --------- -----------
  --------- -
    ----
      --- ----------- ---- -- ------ --- - - -------
        --------------
        ------- ---------------------------------------
      -----
    -----
    ------ -------- -------------------------------------- ------------------
    ------- -------------------------------- ------------------------------
  -
--
------ ----- ------------ -
  ----- - --------- -------- ---------

  ---------------- -------- ---- -
    ----------------------------
  -

  ----------------- -------- ---- -
    ------------------------ ---
  -
-

方式二:手动使用迭代器

如果不想使用任何开发框架或工具,我们可以手动使用迭代器来完成对 for...of 循环中的 break 和 continue 语句的特殊处理。具体而言,我们需要使用一个 for...of 循环语句,手动实现迭代器的 next() 方法,并在该方法中处理 break 和 continue 语句。示例如下:

-- -------------------- ---- -------
-------- ----------------- -
    --- -- - ----------------------------
    --- ------ - ----------
    ----- -------------- -
        --- ----- - -------------
        -- -- ----- - -------- --
        -- ------ --- ----------- -
            ------ - ----------
            ---------
        -
        -- ------ --- -------- -
            ------
        -
        -------------------
        ------ - ----------
    -
-
--- --- - --- -- ----------- -- -------- ---
------------- -- -- - - -

以上代码手动实现了迭代器的 next() 方法,并对循环内部的 break 和 continue 语句进行了特殊处理。在使用 for...of 循环时,只需要将可迭代对象传递给 myForOf() 函数,即可完成跳出循环和跳过一次循环的操作。

示例代码

最后,我们提供一个完整的示例代码,包括了使用开发框架和手动使用迭代器两种方式来解决 for...of 循环中的 break 和 continue 语句问题。代码如下:

-- -------------------- ---- -------
------ - ---------- ----- - ---- ----------------

------------
  --------- ----------------
  --------- -
    ----
      --- ----------- ---- -- ----- - ---------
        --------
      -----
    -----
    ------- --------------------------------
  -
--
------ ----- ---------------- -
  -------- ----- - --------- -------- ---------

  ---------- ---- -
    ------------------------------------------- - -----
  -
-

------ -------- ----------------- -
    --- -- - ----------------------------
    --- ------ - ----------
    ----- -------------- -
        --- ----- - -------------
        -- -- ----- - -------- --
        -- ------ --- ----------- -
            ------ - ----------
            ---------
        -
        -- ------ --- -------- -
            ------
        -
        ----- ------
        ------ - ----------
    -
-

如上代码中,我们通过自定义 Angular 指令 MyForOfComponent,在模板中使用了我们手动实现的 myForOf 迭代器,并实现了 addItem() 方法来在模板中添加新的元素。在 MyForOfComponent 组件的实现中,我们调用了 myForOf(iterable) 函数来手动实现循环内部的 break 和 continue 语句的特殊处理。可以看到,使用开发框架和手动使用迭代器两种方式都能很好地解决 for...of 循环中的 break 和 continue 语句问题。

结论

对于使用 for...of 循环时出现的 break 和 continue 语句问题,我们可以通过使用某些开发框架或工具,或手动使用迭代器的方式进行特殊处理来解决。在实际应用中,我们需要根据具体情况选择不同的方式,以便在 for...of 循环中完成跳出循环或跳过一次循环的操作。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/677636e76d66e0f9aa0f3117

纠错
反馈