我知道什么是for... in循环(对键进行迭代),但是第一次听说for... of(对值进行迭代)。
for... in
for... 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 is does not log "3", "5", "7", "hello" }
我得到的是,for... of遍历属性值。那么,为什么它不记录(返回)"3", "5", "7", "hello"而不是"3", "5", "7"?但是for... in循环遍历每个键("0", "1", "2", "foo")。在这里,for... in循环还会遍历foo键。但是for... of不会迭代foo财产的价值,即"hello"。为什么会这样呢?
"3", "5", "7", "hello"
"3", "5", "7"
"0", "1", "2", "foo"
foo
"hello"
总而言之:
在这里,我控制台for... of循环。它应该记录,"3", "5", "7","hello"但是在这里记录"3", "5", "7"。为什么呢
"3", "5", "7","hello"
for in 遍历对象的可枚举属性名称。
for in
for of(ES6中的新增功能)确实使用了特定于对象的迭代器,并循环了由该对象生成的值。
for of
无论for..of和for..in语句叠代列表; 但是,迭代的值不同,它for..in返回要迭代的对象上的键的列表,而for..of返回要迭代的对象的数字属性的值的列表。
for..of
for..in
这是一个展示这种区别的示例:
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 implement Symbol.iterator属性)允许访问存储的值。
Map
Set implement 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" }