首页 > 解决方案 > 为什么我需要添加 [i-1] 以使循环正确地遍历数组?

问题描述

所以我知道使用 for of 循环,我可以console.log(i)立即使用,但是当我一开始学习它时,我修改了代码并通过添加“-1”让它工作,我想知道为什么它作品。

const numbers = [1,2,3,4,5]
sum = 0
for(const i of numbers) {
    sum = numbers[i-1]
    console.log(sum) 
}

上面代码的输出是 1,2,3,4,5,没有 -1 的输出是 2,3,4,5,undefined。

有人可以向我解释为什么会发生这种情况。

谢谢

标签: javascriptecmascript-6

解决方案


您正在混淆和混合 和 的for-of用法for-infor-in将遍历数组*中的每个索引,而for-of将遍历数组中的每个。因此,循环遍历您的数组并for-in产生索引“0、1、2、3、4”,并使用for-of值“1、2、3、4、5”的结果。后者不能用于索引数组,因为数组是从 0 开始的,这意味着最大的有效索引是 4。

所以你应该做一个或另一个:

for-of

for (const i of numbers) {
    sum = i
    console.log(sum) 
}

for-in

for (const i in numbers) {
    sum = numbers[i]
    console.log(sum) 
}

*:正如所指出的,for-in这比仅遍历数组的索引要复杂一些。更完整的解释是它遍历对象的所有属性键,以及恰好是其索引的数组。您还可以使用它来获取对象键、实例属性和方法名称以及其他类似的东西。

因此,for-in在数组上使用被认为是一种不好的做法,因为如果您或您导入的库将其他实例属性插入到数组中,这些属性将包含在迭代中,并且可能会在您尝试访问时破坏您的程序array["someKey"](因为它可能包含与数字键位不同类型的数据)。相反,您应该使用for-ofArray.forEachfor (let i = 0; i < array.length; i++)自信地访问数组的索引或值。


推荐阅读