使用es5语法模拟一个迭代器
function createIterator(item){
var i = 0;
return {
next: function () {
var done = (i>item.length);
var value = !done ? item[i++] : undefined;
return {
value: value,
done: done
}
}
}
}
var arr = [1,2,4,6];
var iterator = createIterator(arr);
console.log(iterator.next()); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: 4, done: false}
console.log(iterator.next()); // {value: 6, done: false}
console.log(iterator.next()); // {value: undefined, done: true}
Symbol.iterator ES6新增
ES6中原生的迭代器有Array、Set、Map和String,for…of能够遍历它们是因为它们具有Symbol.iterator属性
该属性指向该数据结构的默认迭代器方法,当使用for…of…迭代该数据结构时
js引擎就会调用其Symbol.iterator方法,从而返回相应的默认迭代器。举例:
let arr = [1,2,4,6];
//也可以使用ES6提供的next()方法手工遍历
let iterator = arr[Symbol.iterator]();
console.log(iterator.next()); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: 4, done: false}
console.log(iterator.next()); // {value: 6, done: false}
console.log(iterator.next()); // {value: undefined, done: true}
Symbol.iterator 来检测对象是否为可迭代的对象
let arr = [];//true
let obj = {};//true
let str = '';//true
let map = new Map();//true
let set = new Set();//true
let num = 123;//false
let isIterator1 = typeof arr[Symbol.iterator] === "function";
let isIterator2 = Object.prototype.toString.call( arr[Symbol.iterator] ) === "[object Function]"
生成器
生成器是一种返回迭代器的函数,通过function关键字后的星号(*)来表示,函数中会用到新的关键字yield
function* yieldIterator(list) {
for (let i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?