for … of 功能
javascript中的for ... of
语句用来遍历可迭代对象,比如遍历数组可以使用如下代码:
1 | const nums = [1, 2, 3, 4, 5]; |
可迭代对象有很多,包括以下这些:
- Array
- String
- TypeArray
- Map
- Set
- NodeList(and other DOM collections)
- Array like objects(
arguments
) - generators produced by generator functions
- User-defined iterables.
for … of 执行原理
for ... of
首先会调用可迭代对象的@@iterator()
方法获取一个iterator
,然后反复调用这个iterator
的next
方法来获取对应的值。
for … of 何时结束迭代?
以下三种情况都会导致for … of结束迭代。
- 遇到
break
语句 - 遇到
continue
语句 iterator
的next
方法返回done: true
时(也就是正常遍历结束)
for … of 不会修改被迭代的对象
for … of底层使用generator实现,每次迭代都会生成一个新的变量,所以不会改变被迭代的对象。下面的代码将数组中每个值加1,并不会改变原来的数组,因为变量num
时迭代时生成的,而且每次迭代就重新生成一个。
1 | const nums = [1, 2, 3]; |
for … of 中可以使用destruction
1 | const students = [ |
何时使用经典的for循环?
所谓经典for循环就是使用下标遍历的循环,类似C语言中的for循环。
1 | const nums = [1, 2, 3]; |
是否使用经典的for循环有一个简单的判断标准,在遍历的过程中是否要改变原数组,如果需要,就使用,否则就可以使用其他循环代替,比如for … of, forEach, filter, map, reduce等。
for…of vs for…in
for ... of
和for ... in
都是用来遍历对象的,但是有一些区别:
for ... of
遍历的是可迭代
对象,而for ... in
遍历的是可枚举
对象。for ... of
遍历的是值,而for ... in
遍历的是键。
Array
对于数组来说,for ... of
遍历的是数组的值,而for ... in
遍历的是数组的键(下标)。
1 | const nums = [1, 2, 3]; |
Object
在对象上使用for ... of
会报错,因为对象不是可迭代对象,但是可以使用for ... in
来遍历对象的键。
1 | const obj = { |
使用for...of
可以对Object.keys
或者Object.values
来进行遍历。
1 | const obj = { |