( 对于 ...在 ) 和 ( for...的 ) 语句?

2022-08-29 22:12:45

我知道什么是循环(它迭代键),但我第一次听说(它迭代值)。for... infor... of

我对循环感到困惑。for... of

var arr = [3, 5, 7];
arr.foo = "hello";
    
for (var i in arr) {
  console.log(i); // logs "0", "1", "2", "foo"
}
    
for (var i of arr) {
  console.log(i); // logs "3", "5", "7"
  // it doesn't log "3", "5", "7", "hello"
}

我理解迭代属性值。那么为什么它不记录而不是?for... of"3", "5", "7", "hello""3", "5", "7"

与循环不同,循环循环遍历每个键 () 并同时循环访问键,而不循环访问属性的值,即 .为什么会这样?for... in"0", "1", "2", "foo"foofor... offoo"hello"

这里我控制台循环。它应该记录,但它记录 .为什么?for... of"3", "5", "7","hello""3", "5", "7"

示例链接


答案 1

for in 在对象的可枚举属性名称上循环。

for of(ES6 中的新功能)确实使用特定于对象的迭代器,并循环访问由该迭代器生成的值。

在您的示例中,数组迭代器确实生成数组中的所有值(忽略非索引属性)。


答案 2

我在迭代器和生成器中找到了一个完整的答案(虽然它是针对TypeScript的,但对于JavaScript也是一样的)

和 语句都循环访问列表;但是,迭代的值是不同的,返回要迭代的对象上的键列表,而返回被迭代对象的数值属性值的列表。for..offor..infor..infor..of

下面是一个示例,演示了这种区别:

let list = [4, 5, 6];

for (let i in list) {
   console.log(i); // "0", "1", "2",
}

for (let i of list) {
   console.log(i); // "4", "5", "6"
}

另一个区别是对任何物体进行操作;它用作检查此对象上的属性的一种方法。 另一方面,主要对可迭代对象的值感兴趣。内置对象,如和实现属性,允许访问存储的值。for..infor..ofMapSetSymbol.iterator

let pets = new Set(["Cat", "Dog", "Hamster"]);
pets["species"] = "mammals";

for (let pet in pets) {
   console.log(pet); // "species"
}

for (let pet of pets) {
    console.log(pet); // "Cat", "Dog", "Hamster"
}