for…of
1. 前言
for...of
对于可迭代的对象(包括:内置的 String、Array、类似数组的对象(arguments 或 NodeList)、TypedArray、Map、Set,和用户定义的可迭代对象等)上创建一个迭代循环,它不局限于数组下的循环,只要是可迭代的对象就可以被 for...of
进行循环。
2. 基本语法
2.1 语法使用
参数解释:
2.2 迭代 Array
for...of
最常用的场景就是对数组的迭代,也是取代 for
、forEach
的最好选择。
let arr = [, , ];
for (let value of arr) {
value += ;
console.log(value);
}
// 11
// 21
// 31
2.3 迭代字符串
for...of
可以迭代字符串,迭代后的结果是把字符进行分割,得到每个单个字符。
let str = '';
for (let value of str) {
console.log(value);
}
// 慕
// 课
2.4 迭代 TypedArray
let iterable = new Uint8Array([, ]);
for (let value of iterable) {
console.log(value);
}
// 0
// 255
2.5 迭代 Set 和 Map
在 Set 和 Map 章节中我们就说到了,Set 和 Map 可以使用 for...of
来进行循环,主要因为 Set 和 Map 具有可迭代属性。
let setArr = new Set([, , , , , ]);
for (let value of setArr) {
console.log(value);
}
// 1
// 2
// 3
上面的代码需要注意的是,迭代的是 new Set()
后的结果,new Set()
会对数组进行去重操作,所以得到以上结果。
let map = new Map([["a", ], ["b", ], ["c", ]]);
for (let value of map) {
console.log(value);
}
// ["a", 1]
// ["b", 2]
// ["c", 3]
上面的代码中使用 new Map()
传入一个二维数组,这里需要注意的是,迭代的结果是一个带有 key 和 value 的数组,所以也可以用数组解构的方式 把 key 和 value 的值取出来,直接使用:
for (let [key, value] of map) {
console.log(key, value);
}
// a 1
// b 2
// c 3
2.6 迭代类数组对象
1. 迭代 argument 对象
我们知道在函数中可以使用 Argument
对象拿到在调用函数时拿到传递的参数,因为 arguments
不是一个 Array
,它属于类数组,可以借助 call
来得到一个数组。[].slice.call(arguments)
, 而使用 for...of
可以直接对 arguments
循环,得到的结果也只是传入的参数。这个可以很方便地去循环类数组对象。
function argfn() {
for (let argument of arguments) {
console.log(argument);
}
}
argfn(,,)
// 1
// 2
// 3
2. 迭代 DOM 集合
//注意:这只能在实现了NodeList.prototype[Symbol.iterator]的平台上运行
let prags = document.querySelectorAll("p");
for (let value of prags) {
value.classList.add("read");
}
3 知识对比
ES5 中提供了很多遍历的方法,下面我们与之一一对比看看 for...of
有什么优势。
3.1 对比 for
最原始的语法是 for
循环语句,但是这种写法比较麻烦,每个步骤的信息都需要手动地去处理。
const fib = [,,,,,,...]; // 斐波那切数列
for (let index = ; index < fib.length; index++) {
console.log(fib[index]);
}
3.2 对比 forEach
fib.forEach((value) => {
console.log(value);
});
3.3 对比 for…in
for (let index in fib) {
console.log(fib[index]);
}
3.4 for...of
的优点
- 有着同
for...in
一样的简洁语法,但是没有for...in
那些缺点; - 不同于
forEach
方法,它可以与break
、continue
和return
配合使用; - 提供了遍历所有数据结构的统一操作接口。
for (let n of fib) {
if (n > )
break;
console.log(n);
}
当迭代项大于 520 时 break
语句会跳出 for...of
循环。
4. 小结
- 对于数组的处理尽量使用
for...of
去迭代数据; - 如果要遍历的是对象,并且没有顺序的限制可以使用
for...in
方式遍历对象更好的处理数据。