为什么我需要添加[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。

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

谢谢

回答

在这一行:

for (const i of numbers)

i获取数组的值而不是索引。因此,i将取值 1、2、3、4 和 5。因此您正在打印具有这些索引的项目。其中前四个已定义,而最后一个根本不存在。


回答

你是混淆和混合的用法for-offor-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-of, Array.forEach, 或for (let i = 0; i < array.length; i++)来自信地访问数组的索引或值。

  • @Samathingamajig I've added a footnote explaining the semantics of `for-in` in more detail.

以上是为什么我需要添加[i-1]才能让循环正确地遍历数组?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>