迭代器是ES2015中新增的规范,与之相关的for...of也是ES2015新增的。javascript
本文来深刻研究一下迭代器是什么,以及迭代器可以干什么?java
或许你对for ... of的执行还不了解,好比什么状况下可使用for ... of去遍历对象,什么状况下会报错等等,这篇文章应该能帮到你。数组
for ... of只能迭代知足【迭代器协议】的对象
可迭代对象的必须存在[Symbol.iterator]方法,该方法一个无参函数,返回迭代器协议的对象。函数
迭代器对象包含一个next()
函数,该函数返回值有两种:this
若是迭代未结束,返回以下spa
return { value: 'item', // item是本次迭代值,能够为任意对象 done: false }
若是迭代已结束,返回以下code
return { done: true }
下面是未提供迭代器的示例。对象
const obj = { name: 'xialei', id: 1 }; for(let item of obj) { // TypeError: obj is not iterable }
下面是提供迭代器的示例。ip
const obj = { name: 'xialei', id: 1, [Symbol.iterator]: function () { // 迭代器属性 const keys = Object.keys(this); // 读取对象键列表 let keyIndex = 0; // 遍历未知 const self = this; // 保存this,next中的function会有本身的this return { // 返回带有next()的对象 next: function () { if (keyIndex < keys.length) { // 防止越界 const key = keys[keyIndex]; keyIndex++; // 移动到下一个位置 return { value: [key, self[key]], // 键值对数组 done: false } } return { // 遍历结束 done: true } } } } };
经过给obj提供迭代器方法让obj也可使用for...of遍历。rem
直接去理解迭代器概念比较困难,用一个简单的例子去简化理解是一件很容易的事情。
String
,Array
,Map
,Set
,TypedArray
是全部内置的可迭代对象,他们的原型对象都有一个[Symbol.iterator]方法。
下面是两种方法迭代String对象的示例。
// for ... of const str = 'xialei'; for(const char of str) { console.log(char); } // iterator const str = 'xialei'; const iterator = str[Symbol.iterator](); // 返回一个{next:方法}对象 let obj = null; do { obj = iterator.next(); // 返回的是对象,{value:任意对象,done:布尔型} console.log(obj.value); }while(!obj.done);
迭代器协议虽然通常用的比较少,可是了解其原理是很是有必要的,这样才能够才须要的实现定义本身的迭代器来遍历对象。
更多原创文章,尽在天天进步一点点