提问者:小点点

JavaScript中的(for…in)和(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"
}

我得到的是,.。。of迭代属性值。那么为什么它不记录(返回)“3”,“5”,“7”,“hello”而不是“3”,“5”,“7”呢?但用于。。。IN循环迭代每个键(“0”,“1”,“2”,“foo”)。此处用于。。。IN循环还对foo键进行迭代。但用于。。。of不迭代foo属性的值,即“hello”。为什么会这样?

一言以蔽之:

在这里我控制台为。。。的循环。它应该记录“3”,“5”,“7”,“hello”,但这里记录的是“3”,“5”,“7”。为什么?

示例链接


共3个答案

匿名用户

forin循环对象的可枚举属性名。

forof(ES6中的新版本)确实使用了特定于对象的迭代器,并对该迭代器生成的值进行循环。

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

匿名用户

我在以下网址找到了完整的答案:https://www.typescriptlang.org/docs/handbook/iterators-and-generators.html(虽然它是针对类型脚本的,但这也是针对javascript的)

for..offor..in语句都对列表进行迭代;但迭代的值不同,for..in返回被迭代对象的键列表,而for..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.。in对任何对象进行操作;它用作检查此对象属性的一种方法。而for..of则主要关注可迭代对象的值。像mapset这样的内置对象实现symbol.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"
}

匿名用户

for.。infor.。of都是循环构造,用于迭代数据结构。它们之间唯一的区别是它们迭代的实体:

  1. for..in迭代对象的所有可枚举属性键
  2. for..of迭代可迭代对象的值。可迭代对象的示例包括数组,字符串和节点列表。

null

let arr = ['el1', 'el2', 'el3'];

arr.addedProp = 'arrProp';

// elKey are the property keys
for (let elKey in arr) {
  console.log(elKey);
}

// elValue are the property values
for (let elValue of arr) {
  console.log(elValue)
}