es6学习——迭代器接口

 
 为什么需要迭代器接口
1  对于一般的迭代循环 使用了 for(i=0;i<...)这中单一结构,只能通过数组进行遍历,且每次遍历都要获取数组值,再通过index取值,不适合所有数组类型;
2 迭代的顺序是固定的 对于具有隐式顺序的结构 比如map set等 是不适用的。
 
 
迭代器就是用于更好的对对象进行迭代的。
 
哪些数据类型内置了迭代器接口 (即不用通过迭代器工厂函数就能够自动实现的)
// 哪些内置了迭代器接口
let test=1; // false
test={1:22}; // false
test=function(){}; // false
test=new Set(); // true
test=new Map(); // true
test=[]; // true
test="1222"; // true
console.log(typeof test[Symbol.iterator] === "function")
 
每个迭代器都表示对可迭代对象的一次性有序遍历 
es6 具有三种集合对象类型:数组、map、set ,三种类型都拥有如下迭代器
          a、entries()返回一个包含键值对的迭代器
          b、values() 返回一个包含集合中的值的迭代器
          c、keys() 返回一个包含集合中的键的迭代器,对于set来说键和值是相同的,对于map来说,迭代器返回每个不重复的键
 
这些迭代器的返回结果
 
// let map=new Map();// 先验证map
let map=new WeakMap();// 验证weakMap
let a=1;
map.set(a,'11');
map.set(2,'22');
map.set(3,'33');
map.set(4,'44');
 
let entries=map.entries();
// console.log(entries) // 返回一个包含键值对的迭代器[Map Entries] { [ 1, '11' ], [ 2, '22' ], [ 3, '33' ], [ 4, '44' ] }
let values=map.values();
// console.log(values) // 返回键值的迭代器[Map Iterator] { '11', '22', '33', '44' }
let key=map.keys();
console.log(key) // 返回键名的迭代器[Map Iterator] { 1, 2, 3, 4 }

  

可以接收上述所说的迭代器可迭代对象的原生语言特性有:
             a、 for-of 循环
            b、 数组解构
            c、 扩展操作符
            d、 Array.from()
            e、 创建集合
            f、 创建映射
            g、 Promise.all() 接收由期约组成的可迭代对象
            h、 Promise.race() 接收由期约组成的可迭代对象
            i、 yield* 操作符,在生成器中使用
 
所以一般可以通过for..of对上述的迭代器进行更好的遍历 进行特性操作
 
 
引申for..in for...of 和forEach区别
 
1 for...in(可以适用于对象和数组)
     会遍历数组所有的可枚举属性  包括原型
Array.prototype.name="zou";
let arr = [1, 2, 3];
for (const item in arr) {
  console.log(item); // 0 1 2 name
}
let obj={1:11,2:22,3:33};
for (let item in obj) {
  console.log(item); // 1 2 3 获取键名
 
不足:
 1 返回的类型不一定按照真实的数组的index 
 2 使用for in会遍历数组活对象所有的可枚举属性,包括原型。例如上栗的原型方法method和name属性 不想的话 可以用hasOwnProperty
    

2 for...of 循环

只能用来 遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合  以及arr/map/set的values()/entries()/ keys() 他们也是具有迭代器接口的集合 以及他们的
 
与forEach()不同的是,它可以正确响应break、continue和return语句 牛逼!!!for in也可以 forEach
 
forEach
循环遍历数组 不能通过break退出;
 
 
posted @ 2022-01-28 12:31  大圆脸de皮革  阅读(99)  评论(0)    收藏  举报