for…of 循环+iterator
//数组对象遍历,打印值
// const arr=[1,2,3,4]
// for(let i of arr){
// console.log(i);
// if(i>2){//可以随时终止循环,forEach就不能
// break;
// }
// }
//set对象遍历,打印值
// const s=new Set(arr)
// for(let i of s){
// console.log(i);
// }
//map对象遍历,打印数组形式的键值
// const m = new Map()
// m.set('m1', 1)
// m.set('m2', 2)
// for (let i of m) {
// console.log(i);
// }
// for (let [key,val] of m) {
// console.log(key,val);//自然可以解构后直接使用
// }
//普通对象遍历
// const obj={
// name:'xm',
// age:18
// }
// for(let i of obj){//obj is not iterable 需要实现可迭代接口
// }
// const set=new Set([1,2,3,4])
// const iterator=set[Symbol.iterator]()//获取set对象中的iterator方法
// console.log(iterator.next());
// console.log(iterator.next());
// console.log(iterator.next());
// console.log(iterator.next());//通过next方法迭代set中的数据,这是for of中的工作原理
//重新尝试通过for of遍历普通对象,首先要实现iterable接口
const obj = {
[Symbol.iterator]: function () {
let index = 0;
const keys=Object.entries(obj);
const _this = this;
return {
next: function () {
const result = {
//iterationResult
value: keys[index],
done: index>=keys.length
}
index++
return result
}
}
},
name: 'xm',
age: 18,
hobby:['eat','drink']
}
for (let i of obj) {//obj is not iterable 需要实现可迭代接口
console.log(i);
}