Symbol.iterator 和 for of
Symbol.iterator 和 for of 是es6的新特性 可以为对象设置 自己的迭代器
首先介绍我们的for of
var arr = [1,2,3,8,33]
for (var i of arr){
console.log(i)
}
1
2
3
8
33
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
就是这么简单
这里呢其实访问了 arr的迭代器调用next的方法的返回值中的value属性 (不知道我在说什么?继续往下看)
然后就是 Symbol.iterator
var arr = [4,5,6,7,8];
var v = arr[Symbol.iterator]();
console.log( v.next() );
console.log( v.next() );
console.log( v.next() );
console.log( v.next() );
console.log( v.next() );
console.log( v.next() );
console.log( v.next() );
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
echo
Object {value: 4, done: false}
Object {value: 5, done: false}
Object {value: 6, done: false}
Object {value: 7, done: false}
Object {value: 8, done: false} //注意这次的done 是 false
Object {value: undefined, done: true}
Object {value: undefined, done: true} //完成以后再次执行也是true
- 1
- 2
- 3
- 4
- 5
- 6
- 7
然而object 是不支持迭代器的,于是我们DIY一个:)
var obj ={
name:1,
age:13,
home:"xxxx"
}
Object.defineProperty(obj,Symbol.iterator,{
enumerable:false, //是否可枚举
writerable:false, //是否可写
configurable:true, //是否删除
value:function(){
var that = this;
var nowindex = 0;
var key = Object.keys(that);
return {
next:function(){
var h = {
value:that[key[nowindex]],
done:(nowindex+1 >key.length )
}
nowindex++;
return h
}
}
}
})
var i = obj[Symbol.iterator]();
console.log( i.next() ); // {value: 1, done: false}
console.log( i.next() ); // {value: 13, done: false}
console.log( i.next() ); // {value: "xxxx", done: false}
console.log( i.next() ); // {value: undefined, done: true}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
done!
等等 i.next()重复了好多次,这样写也太sb了:( 我好像想到了刚刚学的 for of 让我们来试试
for (var y of obj){
console.log(y)
}
echo
1
13
xxxx
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
这样就漂亮多了
Symbol.iterator 和 for of的更多相关文章
- Iterator遍历器 调用Symbol.Iterator属性,遍历器对象。
Iterator实现原理 创建一个指针对象,指向当前数据结构的起始位置.也就是说,遍历器对象本质上,就是一个指针对象. 第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员. 第二次调 ...
- Es6 Symbol.iterator
Symbol.iterator 为每一个对象定义了默认的迭代器.该迭代器可以被 for...of 循环结构使用. --描述 当需要迭代一个对象的时候(比如在 for...of 循环的开始时),它的 @ ...
- ECMA Script 6_symbol(symbol.iterator) 新接口_iterator接口
iterator 接口 只要部署了 iterator 接口 symbol(symbol.iterator), 则可以进行 for...of 遍历
- symbol,iterator,generator
1.symbol是在ES6中引入的一种基本数据类型,因为symbol是不重复.唯一的数据特性,symbol设计是被用来表示对象内部的私有属性的. symbol.for与symbol.keyfo ...
- 关于Symbol.iterator 学习笔记
1.可以部署在对象上的一个遍历器 2. 遍历器是一个函数,需要返回一个含有一个next 方法的对象 const likeArray = {0:'a', 1: 'b', 2: 'c',3: 'd'. l ...
- Symbol.iterator的理解
https://blog.csdn.net/margin_0px/article/details/82971545
- ES6(模板字符串,三点运算符,Symbol,iterator接口)
模板字符串 作用:简化字符串的拼接 模板字符串必须用``包含 变化的部分使用${xxx}包含 对象的简写方式 同名的属性可以省略不写 可以省略函数的function 箭头函数 箭头函数的特点 箭头函数 ...
- 用vue.js学习es6(六):Iterator和for...of循环
一.Iterator (遍历器)的概念: 遍历器(Iterator)就是这样一种机制.它是一种接口,为各种不同的数据结构提供统一的访问机制.任何数据结构只 要部署Iterator接口,就可以完成遍历操 ...
- 14 Iterator和for...of循环
Iterator和for...of循环 首先 Iterator 是一个接口. 标准是 function makeIterator(array) { var nextIndex = 0; return ...
随机推荐
- [TJOI2016 & HEOI2016] 字符串
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4556 [算法] 不难发现 , 对于每个询问 ans = max{ mi ...
- JavaScript ES6中export、export default、import用法和区别
相信熟悉JS ES6的同学都知道export.export default是导出,import是导入的意思. 那么问题就来了, 1.import 导入要怎么用? 2.export.export def ...
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源方法
一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基 ...
- Java中next() 与 nextLine() 区别
next(): 1.一定要读取到有效字符后才可以结束输入. 2.对输入有效字符之前遇到的空白,next() 方法会自动将其去掉. 3.只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符. 4. ...
- eclipse编译Jmeter源码
1.在apache官网下载源码和安装包 http://jmeter.apache.org/ 2. 解压 解压安装包和源码包, 将安装包apache-jmeter-3.3 里lib ...
- Flutter实战视频-移动电商-12.首页_GridView类别导航制作
12.首页_GridView类别导航制作 首页导航区的制作 外面用一个gridview来写.里面单独提出来 新建导航组件 还是在home_page.dart里面写代码 新建一个静态的组件: 快捷键写组 ...
- QDUOJ 东北大炸弹 宝岛地图-枚举+数组记录+前缀和
冰清玉洁丶YCB 发布时间: 2017年6月18日 21:39 最后更新: 2017年6月18日 21:40 时间限制: 1000ms 内存限制: 256M 描述 YCB是公认的冰清玉洁, ...
- 201621123016 《Java程序设计》第八周学习总结
1. 本周学习总结 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 ArrayList在调用contains方法时会调用indexOf方法得到 ...
- NDAP 日志
2014.04.29 1.理论债券价格CalculateExpetedBondPrice计算有误差 CalculateLibrary中的计算理论债券价格(计算理论期货价格的反函数)和正确结果有误差(可 ...
- 笔记-JavaWeb学习之旅13
验证码案列 昨天晚上出现的500错误原因在于验证码没有获取到,获取验证码是应该获取的是共享域中的验证码,而我把获取值得键给写成了jsp中的键,而不是内存生成图片中,然后把图片上传到共享域中的键.这两个 ...