Vue.jses6 语法学习vue技术学习

ES6基础教程(第十一节)——迭代器

2019-07-07  本文已影响2人  多平方

上一节我们学习了 for...of,但是却没有用它来遍历对象,这节课我们用它遍历对象来引出迭代器的概念:

//定义一个的Object对象

let obj = {"name":"超级棒"};

//咱们来for...of一下

for(let v of obj){

console.log(v);

}

//结果:报错

//错误提示:obj[Symbol.iterator]不是一个function

既然报错了,其实这正是我们要的效果,要想能够被 for...of正常遍历的,都需要实现一个遍历器Iterator,而数组之类的数据结构的原型中就有 Symbol.iterator方法,而Object对象并没有实现这个接口,使得它无法被 for...of,但是却没有用它来遍历对象,这节课我们用它遍历对象来引出迭代器的概念:

//数组

Array.prototype[Symbol.iterator];

//结果:function values(){...}

//字符串

String.prototype[Symbol.iterator];

//结果:function Symbol.iterator{...}

//Set结构

Set.prototype[Symbol.iterator];

//结果:function values(){...}

//Map结构

Map.prototype[Symbol.iterator];

//结果:function entries(){...}

//Object对象

Object.prototype[Symbol.iterator];

//结果:undefined

Iterator遍历器的原理:

当可遍历对象被 for...of遍历的时候,Symbol.iterator就会被调用,返回一个iterator对象。其中还有一个很重要的方法:next( );

//数组:一个可遍历对象

let arr = ['a','b','c'];

//调用数组的Symbol.iterator()方法

let iter = arrSymbol.iterator;

iter.next();

//结果:{value: "a", done: false}

iter.next();

//结果:{value: "b", done: false}

iter.next();

//结果:{value: "c", done: false}

iter.next();

//结果:{value: undefined, done: true}

先调用可遍历对象的 Symbol.iterator方法,得到一个iterator遍历器对象,然后就在遍历器上不断调用 next( )方法,直到done的值为true的时候,就表示遍历完成结束了。

如何让对象也能够支持 for...of呢?让我们给它造一个就搞定了:

//定义一个的Object对象

let obj = {

0:"我是0",

1:"我是1",

2:"我是2",

length:3,

//添加[Symbol.iterator]方法

[Symbol.iterator] : function() {

    let _this = this;

    let index = 0;

    return {

        next:() => {

            let value = _this[index];

            let done = (index >= _this.length);

            index++;

            return {value,done}

        }

    }

}

};

//咱们来for...of一下

for(let v of obj){

console.log(v);

}

//结果:"我是0"

// "我是1"

// "我是2"

小结:Iterator遍历器为各种数据结构提供一个统一的遍历接口,使得 for...of能够轻松简便地访问数据成员。 数据结构实现了Iterator接口,我们称之为可遍历对象。我们也可以自己创建可遍历对象并自定义遍历行为。

公众号
上一篇下一篇

猜你喜欢

热点阅读