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++迭代器 ...
随机推荐
- window.opener的用法
window.opener 主要用来打开窗体的父窗体,可以通过这种方式设置父窗体的值或者调用js方法. 例如: 1,window.opener.test(); ---调用父窗体中的test()方法 2 ...
- Outlook 客户端无法通过 MAPI over HTTP 连接
随着Exchange 版本更新升级,是否进行验证客户端建立MapiHttp连接所需的服务器设置已正确配置.即使服务器,负载均衡器和反向代理的所有设置都正确,您可能会遇到连接到Exchange Serv ...
- css块级元素居中
<!DOCTYPE html> <html> <head> <title>index</title> </head> <b ...
- [0] 自定义特性AttributeUsage
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Fxframe ...
- 补:关于man关于SEE ALSO(参见)中代号与vim下常用命令
1.查阅/etc/issue文件时,使用man issue发现manual中see also出现motd(5), agetty(8), mingetty(8)字样.以及文档行首的issue(5)究竟是 ...
- C++之const限定符
作者:tongqingliu 转载请注明出处: C++之const限定符 const初始化 const的特点: 用const加以限定的变量,无法改变. 由于const对象定义之后就无法改变,所以必须对 ...
- printf和scanf整理(后续填补)
scanf和printf头文件:<stdio.h> 1.%d.%3d.%03d.%-3d区分 %d:以十进制形式输出整数(int) %3d:指定宽度为3,不足的左边补空格 %03d:一种左 ...
- PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/event.so'
这是因为启动apche 的时候重复加载了php的动态库模块了, 将:/etc/php.d/ 目录下的event.ini中的内容注释掉或者将文件删除即可
- 修改linux的系统时间
可以使用date命令.date用于打印或设置系统日期和时间.设置系统时间需要root权限.用法示例:设置系统日期成2015年08月13日,这样会把具体时间设置清空成00:00:00$ sudo dat ...
- PHP按值合并数组
/** * PHP按值合并数组 * */ function my_array_merge(&$array1, &$array2) { $result = Array(); foreac ...