当前位置: 首页 > 知识库问答 >
问题:

(for…in)和(for…of)语句之间有什么区别?

贲凌
2023-03-14

我知道什么是“代号”...在循环中(它迭代键),但我听说过for...(它迭代值)。

我对感到困惑...的循环。

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”

与用于...的不同...在循环中,该循环迭代每个键(“0”、“1”、“2”、“foo”)并迭代foo键,的...of不迭代foo属性的值,即“hello”。为什么会这样?

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

示例链接

共有2个答案

澹台浩广
2023-03-14

我在迭代器和生成器中找到了完整的答案(虽然是针对TypeScript,但对于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"
}
壤驷泓
2023-03-14

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

forof(在ES6中是新的)确实使用了特定于对象的迭代器,并在其生成的值上循环。

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

 类似资料:
  • 与...的循环中,该循环迭代每个键()并迭代键,用于...的值不迭代属性的值,即。为什么是那样? 在这里,我为...控制台循环的。它应该记录但它记录。为什么? 示例链接

  • 问题内容: 我知道什么是循环(对键进行迭代),但是第一次听说(对值进行迭代)。 我对循环感到困惑。我没有形容词。这是下面的代码: 我得到的是,遍历属性值。那么,为什么它不记录(返回)而不是?但是循环遍历每个键()。在这里,循环还会遍历键。但是不会迭代财产的价值,即。为什么会这样呢? 总而言之: 在这里,我控制台循环。它应该记录,但是在这里记录。为什么呢 问题答案: 遍历对象的可枚举属性名称。 (E

  • 本文向大家介绍for in 和 for of 的区别?相关面试题,主要包含被问及for in 和 for of 的区别?时的应答技巧和注意事项,需要的朋友参考一下 for of 用于遍历于数组和可迭代对象得到的是entity({key: value}), for in 用于遍历对象的得到的是对象的属性名 for in 不可用来遍历一个数组, for in 将会把数组中的 length 等不需要的属

  • 问题内容: 和JPQL运算符有什么区别? 问题答案: IN测试是您提供给查询(或通过子查询获取)的值中的单值路径表达式(实体的持久属性)的值。 MEMBER OF测试是您提供的值,用于查询(或使用表达式定义)实体中某些集合中的值成员。 让我们使用以下示例实体: 以及以下测试数据: 通过以下查询,我们得到a1作为结果,因为它的someValue是(0,1,3)之一。在查询中使用文字(在 SELECT

  • 问题内容: 我认为标题总结了这一点。我只是想知道为什么对于从Svn进行Java项目的持续集成构建而言,一个或另一个更好。 问题答案: 作为CruiseControl的长期提交者 以及 从未使用过Hudson的人,我颇有偏见,但我的看法是: Hudson的安装和运行起来非常容易(很大程度上是通过一个不错的Web界面),并且拥有一个非常活跃的插件开发社区。 CruiseControl获得了很多第三方的

  • 当扩展在其他板条箱中定义的特性时,似乎有两种默认实现新特性的方法。 性状的原始定义是 为了扩展该特征的功能,我们定义了一个特征, 现在,由于我们希望该功能在默认情况下可用,我们可以实现以下功能 我所观察到的是,当与trait对象混合时,这两种实现都是必需的。 我理解