允许遍历Arrays(数组) Strings(字符串) Maps(映射) Sets(集合)等可迭代的数据结构
for(variable of iterable){
statement
}
variable :每个迭代的属性值被分配给该变量
iterable:一个具有可枚举属性并且可迭代的对象
const arr = [1, 3, 7]
for (const value of arr) {
console.log(value) // 1,3,7
}
Map对象就是保存 key-value 键值对。对象和原始值可以用作key键或value值。 Map对象根据其插入方式迭代元素。
for of循环将为每次迭代返回一个key-value数组
const iterable = new Map([['one', 1], ['two', 2]]);
for (const [key, value] of iterable) {
console.log(`Key: ${key} and Value: ${value}`);
// Key: one and Value: 1
}
Set对象允许你存储任何类型的唯一值,这些值可以是原始值或对象。Set对象知识值的集合。
Set集合中的值只能发生一次。如果您创建一个具有多个相同元素的Set集合,那么它仍然被认为是单个元素。
const iterable = new Set([1, 1, 2, 2, 1]);
for (const value of iterable) {
console.log(value); // 1 2
}
- 生成器 Generator
生成器是一个函数 它可以退出函数,稍后重新进入函数
function* generator(){
yield 1;
yield 2;
yield 3;
}
for(const g of generator()){
console.log(g) //1 2 3
}
- 普通对象不可迭代
用Array.from
const obj = { length: 3, 0: 'foo', 1: 'bar', 2: 'baz' };
const array = Array.from(obj); //["foo", "bar", "baz"]
console.log(array)
for (const value of array) {
console.log(value);
}
- for in
for in 循环将遍历对象的所有可枚举属性
Array.prototype.newArr = () => { };
Array.prototype.anotherNewArr = () => { };
const array = ['f是颠三倒四o', 'bar', 'baz'];
for (const value in array) {
console.log(value); // 0 1 2 newArr anotherNewArr
}
for...in
不仅枚举上面的数组声明,它还从构造函数的原型中查找继承的非枚举属性,在这个例子中,newArr
和 anotherNewArr
也会打印出来。
for - of 更多用于特定的集合,但不包括所有对象
for-in 不考虑构造函数的不可枚举属性。它只需要查找可枚举属性并将其打印出来