ES2021 中 for of 的坑

阅读时长 4 分钟读完

在前端开发中,我们经常使用 for...of 循环来遍历数组、Map、Set 等可迭代对象。但是,在 ES2021 中,使用 for...of 循环时有可能会遇到一些坑,本文将详细介绍这些坑,并提供一些学习和指导意义。

坑1:对于某些可迭代对象,for...of 循环会跳过第一个元素

在 ES2021 中,通过 new DataView() 创建的 DataView 对象、TypedArray 对象和 DataViews 对象都是可迭代对象,但是在使用 for...of 循环遍历这些对象时,会跳过第一个元素。例如:

上述代码本应输出 42,但是实际上却输出了 0。这是因为 for...of 循环会从第二个元素开始迭代,跳过第一个元素。解决这个问题的方法是将需要遍历的对象转换为数组,再使用 for...of 循环遍历数组。

坑2:对于某些可迭代对象,for...of 循环会重复最后一个元素

在 ES2021 中,通过生成器函数返回的迭代器对象也是可迭代对象,但是在使用 for...of 循环遍历这些对象时,会重复最后一个元素。例如:

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

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

上述代码本应输出 0、1、2,但是实际上却输出了 0、1、2、2。这是因为 for...of 循环不知道迭代器对象是否已经遍历结束,因此会重复最后一个元素。解决这个问题的方法是在 for...of 循环内部判断迭代器对象是否已经遍历结束,如果已经遍历结束,则跳出循环。

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

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

坑3:对于某些可迭代对象,for...of 循环会抛出错误

在 ES2021 中,通过 DOM API 返回的 NodeList 对象、HTMLCollection 对象和伪数组对象也是可迭代对象,但是在使用 for...of 循环遍历这些对象时,会抛出错误。例如:

上述代码本应遍历所有 div 元素,但是实际上却抛出了 TypeError 错误。这是因为 NodeList 对象、HTMLCollection 对象和伪数组对象并没有实现迭代器接口。解决这个问题的方法是将需要遍历的对象转换为数组或使用 Array.from() 方法生成数组,再使用 for...of 循环遍历数组。

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

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

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

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

结论

在使用 for...of 循环遍历可迭代对象时,一定要注意以上三个坑,特别是在遍历 DataView 对象、TypedArray 对象、DataViews 对象、生成器函数返回的迭代器对象以及 DOM API 返回的 NodeList 对象、HTMLCollection 对象和伪数组对象时要格外谨慎。若遇到上述问题,则需要将可迭代对象转换为数组或使用 Array.from() 方法生成数组,再使用 for...of 循环遍历数组。

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

纠错
反馈