Iterator、for..of,for...in和自定义遍历器

  • Iterator:
var arr = [1,2,3,4,5];
var ite = arr[Symbol.iterator]();
console.log(ite.next());
console.log(ite.next());
console.log(ite.next());
console.log(ite.next());
console.log(ite.next());
console.log(ite.next());
//依次打印:Object {value: 1, done: false};
Object {value: 2, done: false};
Object {value: 3, done: false};
Object {value: 4, done: false};
Object {value: 5, done: false};
Object {value: undefined, done: true}.
注释:1.Iterator就是一个指针;
2.指针默认在-1的位置;
3.没有遍历完的时候done的值是false,遍历完了就是true;
4.意义:提高具有遍历接口数据的效率;
5.特点:它用来访问具有遍历接口数据,有一个next方法(指针).
  • for..of,for...in:

普通数组遍历:

let arr = [1,2,3,4,5];
for(let item of arr){
console.log(item);
}
//输出:1 2 3 4 5。

迭代器遍历:

let iterator = arr[Symbol.iterator]();
let result = iterator.next();
while(!result.done){
console.log(result.value);
result=iterator.next();
}
//输出 1 2 3 4 5。

数组 Set Map

var s = new Set([1,2,3]);
console.log(s);//打印:Set(3) {1, 2, 3};
var itera = s[Symbol.iterator]();
console.log(itera.next());//打印:Object {value: 1, done: false}; var m = new Map([["age",21],["sex","男"]]);
m.set("name","曹伟");
console.log(m);//打印:Map(3) {"age" => 21, "sex" => "男", "name" => "曹伟"};
var i = m[Symbol.iterator]();
console.log(i.next());//打印:Object {value: Array(2), done: false}; let obj = {x:1,y:2,z:3};
let arr = ['a','b','c'];
for(let key in obj){
console.log(key);//打印:x y z;
console.log(obj[key]);//打印:x 1 y 1 z 1;
}
for(let key in arr){
console.log(key);//打印:x y z;
console.log(arr[key]);//打印:x 1 y 1 z 1;
}
注释:1.遍历对象用forin,遍历数组,Map,Set,类数组用for of。
2.for in可以遍历对象,也可以遍历数组.
  • 自定义遍历器:
var arr = [1,2,3,4,5];
function Iterator(arr){
let i = -1; //遍历器默认指在-1的位置;
function next(){ //返回一个方法;
i++; //当next的时候,i向后移;
let value; //声明一个空的变量;
let done = flase; //done的默认值是没有遍历完成;
if(i == arr.length){ //如果i等于数组的长度的时候,i就溢出了,所以value的值是undefined,done的值是true;
value = undefined;
done = true;
}else{ //否则value的值就等于数组中的值;
value=arr[i];
}
return {value:value,done:done}; //返回两个值,一个值是value,另一个值是done;
}
return {next:next}; //返回next方法;
} var ite = arr[Symbol.iterator]();
console.log(ite.next());
console.log(ite.next());
console.log(ite.next());
console.log(ite.next());
console.log(ite.next());
console.log(ite.next());
依次打印:Object {value: 1, done: false};
Object {value: 2, done: false};
Object {value: 3, done: false};
Object {value: 4, done: false};
Object {value: 5, done: false};
Object {value: undefined, done: true}.

Iterator、for..of,for...in和自定义遍历器**的更多相关文章

  1. 【前端】【javascript】es6中的遍历器接口Iterator

    好久没发文章啦-.-为了证明我还活着,我决定从笔记里面抓一篇还算不乱比较像文章的发出来... 这些笔记是我在学es6的时候断断续续记录的,最近会一份一份整理陆陆续续发出来,顺便也自己再看一遍.我学习e ...

  2. Iterator(遍历器) 和 for...of 循环

    是generator的前置知识 generator :https://www.cnblogs.com/wangtong111/p/11322961.html 遍历器(Iterator)就是这样一种机制 ...

  3. c++ 为自定义类添加stl遍历器风格的遍历方式

    为仿照stl的遍历风格,实现对自定义类型的遍历. 1. 需要遍历的基础结构: struct ConnectionPtr { int id_; int port_; string addr_; //st ...

  4. php 对象的自定义遍历

    php对象的自定义遍历 对手册中的案例进行分析 更好的理解foreach() 的遍历步骤 class myIterator implements Iterator { private $positio ...

  5. ES6的 Iterator 遍历器到底是什么?

    这节课要讲的是ES6中的Iterator. for...of为啥不遍历Object对象 第十三节我们讲了简单又实用的for...of,我们可以使用它来遍历数组,字符串,Set和Map结构,但是有没有发 ...

  6. Iterator遍历器 调用Symbol.Iterator属性,遍历器对象。

    Iterator实现原理 创建一个指针对象,指向当前数据结构的起始位置.也就是说,遍历器对象本质上,就是一个指针对象. 第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员. 第二次调 ...

  7. ES6的Iterator遍历器

    JS表示集合的对象主要有Array.Set.Object.Map,在以前,遍历它们需要使用2种不同的方法,而现在,JS提出了Iterator机制,可以给不同的数据结构提供统一的遍历方法,就是for…o ...

  8. Java SE之For增强与Iterator遍历器提取数据(附Map.Entry)

    增强for循环: 1.操作数组 2.操作List集合 3.操作Map集合    1.map.values()法    2.map.keySet()法  [传统方法]    3.Map.Entry法   ...

  9. C++泛型编程(1)--自己实现C++迭代器/遍历器 iterator

    1.原理 迭代器又称为遍历器,用于访问容器中的数据,迭代器旨在算法和容器之间搭建访问的桥梁,从而使算法和数据分离,不用关心数据具体的存储细节.具体的原理描述请参考以下两个博客: [1].C++迭代器 ...

随机推荐

  1. Webdriver+Java实现使用cookie跳过登录

    Webdriver+Java实现使用cookie跳过登录   Webdriver模拟登录过程中很有可能遇到验证码,最近认真学习了下如何使用cookie直接跳过登录过程. 一.cookie的定义 来源百 ...

  2. 【2017-06-05】Jquery.ajax

    AJAX  是一种网页数据异步加载技术 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 一.Json     ...

  3. angularJS ng-change错误的解决方案

    导入文件:<script src="../../js/angular/angular-file-upload/angular-file-upload.js"></ ...

  4. C语言到C++(1) - 基本变化

    说到C++和C语言的区别,大部分人都会想到面向对象和面向过程.然而这种说法并不准确.面向对象和面向过程指的是两种不同的程序设计思想,而C++与C是两种编程语言,难道C++就不能用于面向过程去解决问题吗 ...

  5. python之numpy库[1]

    python-numpy python中的数据 一维数据 用列表和集合表示 数组与列表的关系 列表:数据类型可以不同 数组:数据类型可以相同 多维数据 用列表表示 高维数据 用字典表示 高维数据仅利用 ...

  6. python之numpy库[2]

    python-numpy csv文件的写入和存取 写入csv文件 CSV (Comma‐Separated Value, 逗号分隔值),是一种常见的文件格式,用来存储批量数据. 写入csv文件 np. ...

  7. axis调用webservice的简单方法

    package com.service; import org.apache.axis.client.Call; import org.apache.axis.client.Service; publ ...

  8. 团体队列UVA540 Team Queue(队列简单用法)

    题目背景 队列和优先级队列是大多数计算机科学家都知道的数据结构.但是团队队列却不被人熟知,尽管在生活中经常出现.比如,午餐时间的食堂门口的队列就是一个团队队列.在一个团队队列中,每个元素属于一个团队. ...

  9. 用CSS美化checkbox复选按钮和raido单选按钮-适用于移动端

    最终效果: 实现方法 index.html: <!DOCTYPE html> <html> <head> <title></title> & ...

  10. v9 调用模型中新增的字段

    在模型中新增字段的时候,可以选择“是否为主表”. 若选是,则前台调用可直接通过字段名调用. 若选否,在前台调用是应在{pc:content}中添加 moreinfo="1",表示允 ...