for in
用于遍历对象中的可枚举属性(含原型链中的)
因数组可看作以下标为属性的对象,字符串可以被视为类似数组的对象(字符串支持通过数值索引来访问字符串中的特定字符),所以数组、字符串也可以用 for in 遍历,但不推荐,因为存在以下缺陷:
- 遍历顺序不确定
for…in遍历的顺序是按照属性创建的顺序,而数组的元素顺序可能会被忽略。 - 遍历到不需要的属性
如果数组对象拥有自定义属性或者原型链上的属性,这些也会被遍历到。
判断对象属性是否可枚举
自定义不可枚举的对象属性
for in 遍历对象的属性
hobby 被设置为了不可枚举的属性,不会被遍历
for of
用于遍历可迭代数据,如字符串、数组、类数组、Set、Map
判断数据是否可迭代
通过使用 Symbol.iterator属性来判断一个数据是否是可迭代的
for of 遍历字符串
for of 遍历数组
for of 遍历类数组
for of 遍历 Set
for of 遍历 Map
for await … of
ES9新增
主要用于遍历异步可迭代对象(也可用于同步可迭代对象)
因 await 需要配合 async 一起使用,所以,使用了 for await…of 外层也需要async。
执行结果:
for await … of 和 Promise.all 的区别
如果结果都是成功
- for await of 会把所有的结果依次输出
- Promise.all 输出一个成功的数组,包含所有成功的返回
如果结果存在失败
- for await of 会把所有的结果依次输出,失败的输出Uncaught(in promise) error
- Promise.all 输出失败的返回值