一、for/of--------数组
1. 对象(默认)是不可迭代的,运行时尝试对常规对象使用for/of会抛出TypeError。
let o = {x:1,y:2,z:3};
for(let element of o){
console.log(element);
}
2. 想迭代对象的属性,可以使用for/in循环或者基于Object.keys()方法的结果使用for/of
let o = {x:1,y:2,z:3};
let keys = "";
for(let k of Object.keys(o)){
keys +=k;
}
//控制台输入 keys 出现“xyz”
3.想迭代每个键对应的值,可以使用基于Object.values()方法的结果使用for/of
let o = {x:1,y:2,z:3};
let sum = 0;
for(let v of Object.values(o)){
sum += v;
}
//在控制台输入sum 出现6
4.既想要对象属性的键,也想要属性的值,可以基于Object.entries()和解构赋值来使用for/of
let o = {x:1,y:2,z:3};
let pairs = "";
for(let[k,v] of Object.entries(o)){
pairs += k + v;
}
//在控制台输入pairs 出现x1y2z3
二、for/of--------字符串
字符串逐个字符迭代:
let frequency = {};
for(let letter of "mississippi"){
if(frequency[letter]){
frequency[letter]++;
}else{
frequency[letter] = 1;
}
}
//在控制台输入frequency 出现{m:1,i:4,s:4,p:2}
三、for/of--------Set和Map
ES6内置的Set(集合)和Map(映射)类是可迭代的。
1.for/of迭代Set时,循环体对集合中的每个元素都会运行一次。
例如,打印出一个文本字符串中的唯一单词
let text = "Na na na na na na Batman!";
let wordSet = new Set(text.split(" "));
let unique = [];
for(let word of wordSet){
unique.push(word);
}
//控制台输入unique 出现["Na","na","Batman!"]
2.Map对象的迭代器并不迭代Map键或Map值,而是迭代键/值对。
每次迭代,迭代器都会返回一个数组,第一个元素是键,第二个元素是对应的值。
let m = new Map([[1,"one"]]);
for(let [key,value] of m){
key// 1
value //"one"
}
四、for/of--------异步迭代
ES2018新增了一种新迭代器,称为异步迭代器,同时新增了一种for/of循环,即使用异步迭代器的for/await循环。
async function printStream(stream){
for await (let chunk of stream){
console.log(chunk);
}
}