数组里存了一堆价格要逐个判断,用js for of写出来最直观:for (const price of prices) { ... },每次循环price直接就是数组里的值,不用再写prices[i]去取。ES6之前拿值只能经典for或forEach,现在这一种就覆盖大多数场景。

能被for of遍历的,是所有实现了迭代器协议的东西:数组、字符串、Map、Set、NodeList、arguments这些。字符串按字符走,Map按键值对走,解构一下两边的变量都有了,判断标准就是看对象上有没有Symbol.iterator这个标记。

const scores = new Map([[1, 90], [2, 85]]); for (const [id, score] of scores) { console.log(id, score); }

和for in的区别

for in拿到的是键名,数组上下标是字符串类型的0、1、2,还会把挂在数组对象上的自定义属性和原型链上的也遍历出来,所以遍历数组别用for in,用for of。一句话记:for in问的是叫什么名字,for of问的是内容是什么。

普通对象直接套for of会报错,提示is not iterable,因为对象默认没有迭代器。要遍历对象就用Object.keys、Object.values或Object.entries先转成数组。

for (const [key, value] of Object.entries(obj)) { console.log(key, value); }

for of支持break、continue和return,中途退出很方便,forEach就做不到,想跳过某次只能绕。需要下标时用数组的entries方法,for (const [i, v] of list.entries()),下标和值一起拿。异步任务别直接在for of里await,想串行就用for await of。

给个选择标准:默认写for of,遍历对象换entries,下标密集的高性能操作再考虑经典for循环,for in留给普通对象的键遍历。