ES6引入了
for...of
循环,作为遍历所有数据结构的统一方式。只要一个数据结构部署了Symbol.iterator
属性,就被视为拥有Iterator接口,就可以用for...of
遍历。for...of
循环可以遍历数组、Set和Map结构、类似数组的对象、Generator对象以及字符串。
注意,for…of不能遍历对象,因为对象没有iterator接口,对象可以使用for…in遍历。
遍历数组
数组原生就具有Iterator接口,可以直接使用for…of遍历。
上面代码的遍历方式只能获得数组的值,不能获得索引,如果要遍历索引可以使用数组的entries
或者keys
方法。
遍历Set和Map结构
在前面的“Set和Map数据结构”已经详细讲过使用for...of
遍历Set和Map结构了,用法也很简单。
上面代码中分别演示了for...of
遍历Set和Map结构,需要注意的一点是Set结构默认是调用values
方法,返回键值的遍历器。而Map结构默认是调用entries
方法,返回键值对的遍历器。
遍历类似数组的对象
类似数组的对象有很多种,下面是使用for...of
遍历字符串、arguments对象以及DOM NodeList对象。
并不是所有类似数组的对象都具有iterator接口,例如下面例子中的likeArray具有length属性,而且键名是数字,对于这种特殊的对象,可以使用Array.from
将其先转为数组,然后遍历。
JavaScript遍历方法的比较
我们以数组为例,JavaScript提供了多种方法遍历数组,常见的有for
、forEach
、for...in
以及for...of
,下面我们来依次比较一下这几种方法的不同之处。for
循环是我们比较熟悉的
for
循环的好处就是能够使用continue
、break
、return
等命令,而短处就是写起来比较麻烦,所有数组内置了forEach
方法。
forEach
内部是一个回调函数,可以对每个成员执行某种操作,但是无法中途跳出循环,continue
、break
命令无法生效。
再来看for...in
,for...in
只能遍历数组的键名,而且它还有几个弊端。
从上面的代码中我们可以看出for...in
的几个弊端:
1、数组的键名是数字,但是for...in
循环是一字符串作为键名’0’、’1’、’2’等
2、for...in
循环不仅遍历数字键名,还会遍历手动添加的其他键,甚至包括原型链上的键
3、某些情况下,for...in
会以任意顺序遍历键名
总而言之,不要使用for...in
遍历数组,它只适合用来遍历对象。for...of
相对于上面的几种遍历方法有以下优点
1、和for...in
一样的简洁语法,但是没有for...in
的那些缺点
2、不同于forEach
方法,for...of
中可以使用continue
、break
命令
3、提供了遍历所有数据结构的统一接口
从上面的代码可以看出,for...of
循环中可以使用continue
和break
循环控制命令,而且不会遍历非数字键名。