
iterator(迭代)一般很少直接使用, 但是却是很常用很重要的功能
例如 :
对象的扩展运算符()内部其实是调用了 Iterator 接口。
在es6 中统一了遍历的接口 Iterator,Iterator 接口的目的,就是为所有数据结构,提供了一种统一的访问机制,即forof循环。
字符串也可以使用扩展运算符
rest运算符, 与扩展运算符是逆运算
扩展运算符:数组=>分割序列
rest运算符:分割序列=>数组
rest可以代替arguments变量
回到主题, 迭代
Symboliterator 为每一个对象定义了默认的迭代器。
当需要对一个对象进行迭代时(比如开始用于一个 forof 循环中),它的 @@iterator 方法都会在不传参情况下被调用,返回的 迭代器 用于获取要迭代的值。
一些内置类型拥有默认的迭代器行为,其他类型(如 Object )则没有。下表中的内置类型拥有默认的 @@iterator 方法:
更多信息请参见 迭代协议 。
js中对象分为可迭代和不可迭代 如果是可迭代哪它就会有一个[Symboliterator] 函数
这个函数就是对象的迭代器函数,如用for of 如果遍历的对象没有这个迭代方法那么就会报错
for of 传入的是可迭代对象,但是如何吧一个不可迭代的对象变为可迭代的对象呢!很简单就是自己写一个[Symboliterator]函数。
你以为迭代就这么简单的结束了吗现在再讲一个新东西 yield
yield是ES6的新关键字,使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return关键字。
yield关键字实际返回一个IteratorResult(迭代器)对象,它有两个属性,value和done,分别代表返回值和是否完成。
yield无法单独工作,需要配合generator(生成器)的其他函数,如next,懒汉式 *** 作,展现强大的主动控制特性。
用 yield 自定义一个迭代器
function () {} 这种函数名字叫 generator函数, 生成器函数, 下一篇再重点讲这个哈
一种自动迭代的更优雅的实现是使用 for循环
在Python中,迭代器(Iterator)和可迭代(iterable)的区别是,迭代器支持 iter ()和 next ()方法;可迭代支持 iter ()方法。可迭代只能在for循环中获得元素,迭代器还可以用next()方法获取元素。
list/truple/map/dict都是可迭代,但不是迭代器;这些数据的大小是确定的;迭代器不是,迭代器不知道要执行多少次,所以可以理解为不知道有多少个元素,每调用一次next(),就会往下走一步。
凡是可以for循环的,都是Iterable
凡是可以next()的,都是Iterator
建议使用迭代器的hasNext()方法进行判断:
使用next()方法时,如果迭代器已经结束,会直接抛出NoSuchElementException异常:
我以获取迭代器遍历Map为例:
这是以前遍历map的标准写法之一。
或者换一种方式:
以上代码为:
public class Main {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
mapput("1", "a");
mapput("2", "b");
mapput("3", "c");
Iterator<MapEntry<String, String>> iterator = mapentrySet()iterator();
while (iteratorhasNext()) {
MapEntry entry = iteratornext();//获取next()对象
Systemoutprintln("key:" + entrygetKey() + " - value:" + entrygetValue());
}
Systemoutprintln("");
Iterator<MapEntry<String, String>> iterator2 = mapentrySet()iterator();
while (true) {//创建死循环
boolean flag = iterator2hasNext();//获取hasNext()的值
Systemoutprint(flag + " ");
if (!flag) {//当hasNext()为false时跳出死循环
Systemoutprintln("跳出死循环");
break;
}
MapEntry entry = iterator2next();//获取next()对象
Systemoutprintln("key:" + entrygetKey() + " - value:" + entrygetValue());
}
}
}
运行结果:
有如下几种写法:
vector<int>::iterator it;it = abegin()+4;
it = advance(abegin(), 4);
it = next(abegin(), 4);
以上就是关于js迭代器iterator全部的内容,包括:js迭代器iterator、Python中的迭代器与可迭代:iter()和next()、迭代器的next()方法返回一个对象,如果返回的对象值为null,表示已经到了迭代器等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)