Iterator、for..of,for...in和自定义遍历器**
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和自定义遍历器**的更多相关文章
- 【前端】【javascript】es6中的遍历器接口Iterator
好久没发文章啦-.-为了证明我还活着,我决定从笔记里面抓一篇还算不乱比较像文章的发出来... 这些笔记是我在学es6的时候断断续续记录的,最近会一份一份整理陆陆续续发出来,顺便也自己再看一遍.我学习e ...
- Iterator(遍历器) 和 for...of 循环
是generator的前置知识 generator :https://www.cnblogs.com/wangtong111/p/11322961.html 遍历器(Iterator)就是这样一种机制 ...
- c++ 为自定义类添加stl遍历器风格的遍历方式
为仿照stl的遍历风格,实现对自定义类型的遍历. 1. 需要遍历的基础结构: struct ConnectionPtr { int id_; int port_; string addr_; //st ...
- php 对象的自定义遍历
php对象的自定义遍历 对手册中的案例进行分析 更好的理解foreach() 的遍历步骤 class myIterator implements Iterator { private $positio ...
- ES6的 Iterator 遍历器到底是什么?
这节课要讲的是ES6中的Iterator. for...of为啥不遍历Object对象 第十三节我们讲了简单又实用的for...of,我们可以使用它来遍历数组,字符串,Set和Map结构,但是有没有发 ...
- Iterator遍历器 调用Symbol.Iterator属性,遍历器对象。
Iterator实现原理 创建一个指针对象,指向当前数据结构的起始位置.也就是说,遍历器对象本质上,就是一个指针对象. 第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员. 第二次调 ...
- ES6的Iterator遍历器
JS表示集合的对象主要有Array.Set.Object.Map,在以前,遍历它们需要使用2种不同的方法,而现在,JS提出了Iterator机制,可以给不同的数据结构提供统一的遍历方法,就是for…o ...
- Java SE之For增强与Iterator遍历器提取数据(附Map.Entry)
增强for循环: 1.操作数组 2.操作List集合 3.操作Map集合 1.map.values()法 2.map.keySet()法 [传统方法] 3.Map.Entry法 ...
- C++泛型编程(1)--自己实现C++迭代器/遍历器 iterator
1.原理 迭代器又称为遍历器,用于访问容器中的数据,迭代器旨在算法和容器之间搭建访问的桥梁,从而使算法和数据分离,不用关心数据具体的存储细节.具体的原理描述请参考以下两个博客: [1].C++迭代器 ...
随机推荐
- java基础之位运算
java中常见的位运算符:&(逻辑与) |(逻辑或) ~(取反) ^(逻辑异或) >>(右移) <<(左移) >>>(无符号右移) &(逻辑与 ...
- VR全景:电商巨头的角逐
VR全景智慧城市:京东推"京东梦"挑战淘宝Buy+ ,VR购物谁主沉浮? VR全景智慧城市是国内首家商业全景平台,结合先进VR虚拟现实技术,以线下实体为依托,将空间还原到线上,用户 ...
- JavaSE教程-02Java基本语法
1.注释 什么是注释 用于解释说明程序作用的文字 Java中注释分类格式 单行注释 格式: //注释文字 多行注释 格式: /* 注释文字 */ 文档注释 格式:/* 注释文字 / 2.关键字 什么是 ...
- Mavnen的几种依赖关系
学习mavnen的时候有几种依赖关系 首先,说一下maven的依赖关系用来干什么? 就是用来控制编译.测试.运行三种classpath的关系 1.compile 的范围 当依赖的scope为compi ...
- Dede CMS如何在文章中增加“附件下载”操作说明
1.进入后台--在"附件管理"中选择"上传新文件" 2.在"说明标题"输入要上传文件的名字,并在下面浏览找到要上传的文件,保存. 3.在&q ...
- 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)
javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 javaCV图像处理之2:实时视频添加图片水 ...
- openjdk7之编译和debug
大家也可以看我的博客: openjdk7之编译和debug,这里格式更好. 为了更好的学习JDK.HotSpot等源码,需要能debug JDK.HotSpot等源码.本文主要讲述,怎么编译open ...
- Spring学习(11)---JSR-250标准注解之 @Resource、@PostConstruct、@PreDestroy
1)@Resource(JSR-250标准注解,推荐使用它来代替Spring专有的@Autowired注解) Spring 不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定 ...
- EF添加
1.添加单个模型(CreatRule()是构造模型)(Shop_ActivityRuleProduct是类) var rule = CreatRule(model); var ruled = db.S ...
- POJ 1459-Power Network(网络流-最大流-ISAP)C++
Power Network 时间限制: 1 Sec 内存限制: 128 MB 题目描述 A power network consists of nodes (power stations, cons ...