javascript - 为什么我需要添加 [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-of
用法for-in
。for-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++)
自信地访问数组的索引或值。
推荐阅读
- java - 从 Tomcat9 运行的 Spark 驱动程序,无法将文件加载到 java 并行流中的 spark 会话中
- javascript - 更改 VSCode 默认格式化程序以将数组项放在新行上?
- powershell - 调用命令的 LastExitCode 与条件不匹配
- bash - 通过命令行为 bash 提供参数
- reactjs - 如何使用组件中的本地状态更新 redux 状态
- jsp - 将带有单选按钮值的多行传递到下一页
- android - 图片未显示在推送通知中
- sqlite - 从 SQLITE 中的两列中选择不同的值
- neo4j - 如何有效地计算 Cypher 中两个节点之间的所有路径?
- .net-core - GetChangeFeedProcessorBuilder 回调第一次为空更改