https://www.zhangxinxu.com/wordpress/2018/08/for-in-es6-for-of/ https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/for…of
定义
我自己理解的:for of是es6出现的一种循环迭代器的api,修复了ES5引入的for…in的不足,利用Symbol.iterator迭代器
MDN:for…of语句在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句
使用
循环数组
循环出来的值是数组索引对应的value值
const array1 = ['a', 'b', 'c'];for (const element of array1) {console.log(element);}// expected output: "a"// expected output: "b"// expected output: "c"
for in也可以循环数组,只不过默认循环出来的是索引
let arr = [1,2,3];for (let i in arr) {console.log(i, arr[i])}// 0 1// 1 2// 2 3
forEach也可以,但是forEach不能中断循环,如果想要强行中断,可以试着抛错,for of可以中断循环
let arr = [1,2,3]arr.forEach(item => {console.log(item)})// 1// 2// 3
循环字符串
其实for in也可以循环字符串,这点,它俩差不多
let iterable = "boo";for (let value of iterable) {console.log(value);}// "b"// "o"// "o"
循环TypedArray
let iterable = new Uint8Array([0x00, 0xff]);for (let value of iterable) {console.log(value);}// 0// 255
循环Map
for in 无法正常迭代
let iterable = new Map([["a", 1], ["b", 2], ["c", 3]]);for (let entry of iterable) {console.log(entry);}// ["a", 1]// ["b", 2]// ["c", 3]for (let [key, value] of iterable) {console.log(value);}// 1// 2// 3
循环Set
let iterable = new Set([1, 1, 2, 2, 3, 3]);for (let value of iterable) {console.log(value);}// 1// 2// 3
循环arguments对象
(function() {for (let argument of arguments) {console.log(argument);}})(1, 2, 3);// 1// 2// 3
循环类数组,比如DOM list
//注意:这只能在实现了NodeList.prototype[Symbol.iterator]的平台上运行let articleParagraphs = document.querySelectorAll("article > p");for (let paragraph of articleParagraphs) {paragraph.classList.add("read");}
循环迭代器
可以使用自定义迭代器进行迭代
迭代可迭代的对象
function* fibonacci() { // 一个生成器函数let [prev, curr] = [0, 1];for (;;) { // while (true) {[prev, curr] = [curr, prev + curr];yield curr;}}for (let n of fibonacci()) {console.log(n);// 当n大于1000时跳出循环if (n >= 1000)break;}
for in 和 for of 注意
- for in 语句以任意顺序迭代对象的可枚举属性,for of 语句遍历可迭代对象定义要迭代的数据
for in 适合遍历对象,for of适合遍历数组(想要中断)和Map、Set这些可迭代器
- for of可以提前中断循环,但是不会关闭迭代器,也就是下一次循环会继续上一次停止的地方开始(注意是迭代器,Symbol.iterator)
let a = [1,2,3,4,5,6]let iter = a[Symbol.iterator]()// 注意这里是迭代器的工厂函数,如果直接使用a进行循环,则会直接终止和关闭for (let i of iter) {if (i === 3) {break}console.log(i)}// 1,2,3for(let i of iter){console.log(i)}// 4,5,6
- for of可以提前中断循环,但是不会关闭迭代器,也就是下一次循环会继续上一次停止的地方开始(注意是迭代器,Symbol.iterator)
for of是es6新语法,注意兼容
- for…of不能循环普通的对象,需要通过和Object.keys()搭配使用
