实际发生了什么......的 vs. 对于...在循环中,为什么它们有时可以互换?

What's actually happening in for...of vs. for...in loops, and why can they sometimes be interchangeable?

提问人:user53 提问时间:5/1/2023 更新时间:5/1/2023 访问量:65

问:

我想知道幕后发生了什么......在 vs. for...of 循环。我不小心在两个类似的实例上切换了它们,其中一个有效,一个无效,我试图弄清楚为什么有效的那个有效,而无效的那个无效。

这些问题涉及进行基本的编码练习,首先列出包含 1-10(含 1-10 的整数)的数组的所有奇数,然后列出所有偶数。我写的内容的详细信息如下。

对于第一个,为了列出所有奇数,我写道:

let numbers = [1,2,3,4,5,6,7,8,9,10]
function displayOddNumbers() {
    for (num in numbers) {
        num % 2 != 0 ? console.log(num) : console.log();
    };
};

这奏效了,所以我继续我的生活,没有意识到我不知不觉地使用了...in 循环而不是 for...of 循环,然后进入下一个练习,该练习要求列出同一数组中的所有偶数。我写道:

function displayEvenNumbers() {
    for (num in numbers) {
        num % 2 == 0 ? console.log(num) : console.log();
    };
};

这没有用;它列出了 0,2,4,6,8。当我把它改成

function displayEvenNumbers() {
    for (num in numbers) {
        num % 2 != 0 ? console.log(numbers[num]) : console.log();
    };
};
then it worked.

但这是怎么回事呢?我意识到我应该使用一个...循环遍历数组,但是幕后发生了什么,让这段代码有时工作,但有时不工作,看似反直觉?

JavaScript 数组 for-in-loop for-of-loop

评论

0赞 tkausl 5/1/2023
in遍历键,遍历值。of
0赞 Bergi 5/1/2023
实际上,它们永远无法互换。甚至你声称“有效”的第一个脚本也记录了字符串,而不是数字
0赞 Bergi 5/1/2023
使用并不能真正解决它。永远不应该用于...在数组的枚举中!numbers[num]

答:

3赞 AngYC 5/1/2023 #1

为。。。of 方法遍历该值,而 for...in 方法遍历键。

当它是一个数组时,键基本上是 ,其中是数组的长度。它之所以适用于您的情况,是因为该值的值与索引非常相似,因此看起来是正确的。0...(n-1)n

当您执行以下操作时:

let numbers = [1,2,3,4,5,6,7,8,9,10]
function displayOddNumbers() {
    for (num in numbers) {
        num % 2 != 0 ? console.log(num) : console.log();
    };
};

你实际上是在从 to 迭代(这意味着你在前面有一个额外的,在后面有一个缺失的,但由于你的检测逻辑等于它们两个,所以它不会被打印出来,你也没有注意到它。换句话说,它正常工作,但键和值之间的相似性让您感到困惑。09010num % 20for...in