正如标题所说,为什么for-of
运行循环体时将循环变量绑定到undefined
不在 中的索引Array
,而其他迭代构造(forEach()
、for-in
等)却没有?
澄清:许多人误解了这个问题
它不是关于:
迭代(不能稀疏)或TypedArray
s任何其他班级如何“正确”迭代在稀疏上Array
(所有其他方法似乎都以预期的方式工作)跳过在一个undefined
元素Array
在 MDN 上找到的以下非正式描述是否不正确?
for...of
语句 [...] 调用自定义迭代钩子,其中包含要为对象的每个不同属性的值执行的语句。
即它也被调用用于不存在的属性。
const sparse = [0, 1, 2] // Was [0, , 2], but some are unfamiliar with this syntax
// or think it creates the array [0, undefined, 2]
delete sparse[1]
for (let e of sparse) console.log('for-of', e)
// Contrast with:
sparse.forEach(e => console.log('forEach', e))
for (let i in sparse) console.log('for-in', sparse[i])
console.log('map', sparse.map(e => e)) // Note, prints incorrectly in the snippet
// console, check browser console
// etc.
这是预期的行为(是)以及为什么以这种方式设计?