lterator 迭代器 静态属性Symbol.iterator Symbol(Symbol.iterator)

**

lterator迭代器

**
迭代模式:提供一种方法是可以顺序获得聚合对象中的各个元素,是一种最简单也最常见的设计模式。他可以让用户透过特定的接口巡防集合中的每一个元素而不用了解底层的实现

迭代器简介:依照迭代模式的思想而实现,分为内部迭代器和外部迭代器

内部迭代:本身是函数,该函数内部定义好迭代规则,完全接手整个迭代过程

外部:只需要一次初始话的调用Array.prototype.forEach jQuery.each内部迭代器

外部迭代器:本身是函数,执行返回迭代对象,迭代下一个元素必须显示调用,调用复杂度增加,但灵活性增强。function outerItreator(){}外部迭代器

// 外部迭代器

let arr = [1,2,3,4]

function outerItreator(o){
    let index = 0;
    let next = () =>{
        return {
            value: o[index],
            done: o.length == ++index
        }
    }
    return {
        next
    }

}
let os = outerItreator(arr);

lterator 的目的:就是要标准化迭代操作

举个例子:服务器提数组数据给前端,前端for循环遍历,但由于业务变化,使得数据结构发生了变化,返回对象或者Set,Map,导致前端遍历代码大量重写

解决方案:ES6引入Iterator,部署在NodeList,arguments,Array,Set,Map,字符串上等数据的Symbol.iterator属性。使得这些数据是iterable可迭代的,能进行for of,for in ,for…,Array.from等操作

**

Symbol

**
数据结构:第七种数据结构;

特点:唯一,可作为对象的属性,有静态属性Symbol.iterator

演示代码:1:let os = Symbol("abc") console.log(typeof os,os)==>Symbol,Symbol("abc")

2:let os = Symbol({}) console.log(os) ==>Symbol([object object])

3:let os = Symbol({name:'zsh',tostring:function (){return 'abc'}}) console.log==> Symbol("abc")

4:let os1 = Symbol("abc") let os2 = Symbol("abc") console.log(os1 === os2)==>false

代码如下添加迭代器(如果不添加[Symbol.iterator]就会报错)
在这里插入图片描述

// ES6添加迭代器
let obj ={
    0:"a",
    1:"b",
    2:"c",
    length:3,
    [Symbol.iterator]:function(){
        let index = 0;
        let next =() =>{
            return {
                value:this[index],
                done:this.length == ++index,
            }
        }
        return {
            next
        }
    }
}

for(prop of obj){
    console.log(prop)
}
console.log([...obj])

你可能感兴趣的:(迭代器)