我知道.。。在
循环中(它在键上迭代),但是第一次听到关于的。。。的
(它对值进行迭代)。
我和<代码>搞混了。。。的循环。我没有用形容词。这是下面的代码:
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”
。为什么?
示例链接
forin
循环对象的可枚举属性名。
forof
(ES6中的新版本)确实使用了特定于对象的迭代器,并对该迭代器生成的值进行循环。
在您的示例中,数组迭代器确实生成数组中的所有值(忽略非索引属性)。
我在以下网址找到了完整的答案:https://www.typescriptlang.org/docs/handbook/iterators-and-generators.html(虽然它是针对类型脚本的,但这也是针对javascript的)
for..of
和for..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
则主要关注可迭代对象的值。像map
和set
这样的内置对象实现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.。in
和for.。of
都是循环构造,用于迭代数据结构。它们之间唯一的区别是它们迭代的实体:
for..in
迭代对象的所有可枚举属性键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)
}