在前端开发中,我们经常使用 for...of
循环来遍历数组、Map、Set 等可迭代对象。但是,在 ES2021 中,使用 for...of
循环时有可能会遇到一些坑,本文将详细介绍这些坑,并提供一些学习和指导意义。
坑1:对于某些可迭代对象,for...of
循环会跳过第一个元素
在 ES2021 中,通过 new DataView()
创建的 DataView 对象、TypedArray 对象和 DataViews 对象都是可迭代对象,但是在使用 for...of
循环遍历这些对象时,会跳过第一个元素。例如:
const view = new DataView(new ArrayBuffer(4)); view.setInt32(0, 42); for (const x of view) { console.log(x); } // 0
上述代码本应输出 42,但是实际上却输出了 0。这是因为 for...of
循环会从第二个元素开始迭代,跳过第一个元素。解决这个问题的方法是将需要遍历的对象转换为数组,再使用 for...of
循环遍历数组。
const array = new Int32Array([42]); for (const x of Array.from(array)) { console.log(x); } // 42
坑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
循环遍历这些对象时,会抛出错误。例如:
const nodes = document.querySelectorAll('div'); for (const node of nodes) { console.log(node); } // TypeError: nodes is not iterable
上述代码本应遍历所有 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