Last updated on

Iterator and Generator in ES6

Other
JavaScriptWeb#Import 2025-05-27 00:21

Iterator and Generator are commonly used features in ES6. In this post, we will walk through the key features of iterator and generator in depth.

Iterator

In JavaScript, an object can be iterated due to it has an inner-built property/object: iterator (which objects?). So in order to let an ordinary object can be iterator, we can add iterator to this object manually.

// add iterator to user object
let user = {
  name: "sam", totalReplies: 17, isBlocked: false
};

user[Symbol.iterator] = function(){

let properties = Object.keys(this); let count = 0; let isDone = false;

let next = () => { if(count >= properties.length){ isDone = true; }

let value = this[properties[count++]];

return { done: isDone, value:{value} };

}; return { next }; };

// iterate user object let values = […user]; console.log(values);

https://gist.github.com/arkilis/3e18e939aa527c41a4c3acbe5bf918e9#file-manualiteraleobject-js

Generator

Generator functions are functions defined with *. They are can be treated as special functions that using keyword yield to return iterator objects.


// Define a generator function
function *nameList(){
    yield "Sam";    // =>  {done: false, value: "Sam"} 
    yield "Tyler";  // =>  {done: false, value: "Tyler"} 
}

//Call generator function for(let name of nameList()){ console.log(name); }

// using spread operator let names = […nameList()]; console.log( names );

// using deconstructor let [first, second] = nameList(); console.log(first, second);

With generator return {done: false, value: "Sam"}, we can shorten the our man-crafted iterable object user as following:

let user = {
  name: "sam", totalReplies: 17, isBlocked: false
};

user[Symbol.iterator] = function *(){

let properties = Object.keys(this); let count = 0; let isDone = false;

for(let p of properties){ yield this[p]; } };

for(let p of user){ console.log( p ); }