了解了 for ... of 循环内部的原理过后,就应该理解为什么 for ... of 循环就可以作为遍历所有数据结构的统一方式。因为它内部就是去调用被遍历对象中的 iterator 方法得到一个迭代器,从而去遍历内部所有的数据。这也就是 iterator 接口所约定的内容,换句话说只要我们的对象也实现了 iterator 接口,那就可以实现使用 for ... of 去遍历普通对象。在 ECMAscript 当中去实现 iterable 接口,实际上就是在这个对象当中去挂载一个 iterator 方法 , 然后在这个方法当中去返回一个迭代器对象。
-
最外层实现了可迭代接口 iterable,这个接口约定内部必须要有一个用于返回迭代器的 iterator 方法;
-
中间层实现了迭代器接口 iterator,这个接口约定了内部必须要有一个用于迭代的 next 方法。返回一个实现迭代器结构的对象;
-
最底层,这个对象实现的是迭代结果接口 iterationResult,这个接口约定的就是我们在这个对象内部必须要有一个 value 属性用来去表示当前被迭代到的数据它的值可以是任意类型;除此之外还必须要有一个 done 的布尔值,表示迭代有没有结束。返回一个迭代结果对象;
const obj = { // 1 store: ['foo', 'bar', 'baz'], [Symbol.iterator]:function(){ let index = 0; const self = this;
return { // 2 next:function () { //用于实现向后迭代的逻辑 const result = { // 3 value: self.store[index], done: index >= self.store.length, } index++; return result } } }}; for (const item of obj) { console.log(item) }