这是JavaScript中的闭包示例吗?或者正在发生什么,我在哪里可以阅读更多关于这里发生的事情?

这是JavaScript中的闭包示例吗?或者正在发生什么,我在哪里可以阅读更多关于这里发生的事情?,javascript,arrays,foreach,for-in-loop,Javascript,Arrays,Foreach,For In Loop,在speeds数组上迭代,如何访问Progress数组的值 let progresses = [93,30,55]; let speeds = [1,30,5]; for(let i in speeds) { console.log(progresses[i]); // [90, 30, 55] } 在数组上迭代,为什么速度[item]未定义且速度[i]值可访问?您只是对数组的内容有误解。forEach的作用是: progresses.forEach((item

在speeds数组上迭代,如何访问Progress数组的值

let progresses = [93,30,55];    
let speeds = [1,30,5];  

    
for(let i in speeds) {
    console.log(progresses[i]); // [90, 30, 55]
}

在数组上迭代,为什么速度[item]未定义且速度[i]值可访问?

您只是对数组的内容有误解。forEach的作用是:

progresses.forEach((item, i) => {
    console.log(speeds[item]); // undefined
    console.log(speeds[i]); // [1,30, 5]
});
传递给您的第一个参数是项本身

无法访问
speed
项目的原因是,您请求的第93个项目不存在,因此它返回未定义,然后您请求的
speed[30]
也不存在,因此它未定义,然后您请求的
speed[55]
再次未定义

随访 当在进程数组上迭代时,console.log(速度[i])如何可能

你的代码是偶然工作的。在变量中使用for..时,得到的是对象的属性。在旧版本的javascript中,根据解释器的不同,可以使用以下代码:

progresses.forEach((item, i) => {
    console.log(item);       // [93,30,55]
    console.log(speeds[i]);  // [1,30, 5]
});
将获得:

for(let i in speeds) {
    console.log(progresses[i]);
}
较新版本的javascript对数组对象进行了更改,因此
length
forEach
等属性不可
enumerable
(在提出这个问题之前,我不知道他们自己更改了这一点)

您可以通过为两个数组指定不同的长度来测试这一点:

progress[0] // prints 93
progress[1] // prints 30
progress[2] // prints 55
progress['length'] // prints 3
progress['forEach'] // prints function
progress['map'] // prints function
.. etc
在上面的代码中,代码只打印
93
,而不是
进度
数组的所有三个元素,因为
速度
数组只有一个元素,因此
i
仅被赋值
0

还请注意,我使用for..of代替for..in,因为for..of被设计为不返回数组的其他属性,例如
length
forEach
。我知道当前的javascript在for..in中没有做到这一点,但遵循良好的实践仍然是一个好主意,因为您无法真正控制用户将使用的浏览器


console.log(i)
for in
循环不应在
速度
之类的数组上使用,请参见您可能正在考虑
for(让i来衡量速度)
i
是一个索引<代码>项不是。我的问题是我在“进程数组”上使用forEach,而不是在“速度数组”上使用forEach,这使得代码难以理解。为什么迭代进程数组时,console.log(speeds[i])怎么可能呢?因为for..in将为您提供进程数组的索引
let progresses = [93,30,55];    
let speeds = [1];  

    
for(let i of speeds) {
    console.log(progresses[i]); // [93]
}