In this chapter, we learned a new way of creating the object property keys using symbols. We saw the iterator and iterable protocols and learned how to implement these protocols in custom objects. Then, we learned how to iterate over an iterable object using the for…of loop. Finally, we ended the chapter by learning what tail calls are, and how they are optimized.
In the next chapter, we will learn about how to do asynchronous programming with Promises and the recently launched async/await feature in ES8, which makes asynchronous code look much more like synchronous code. Let's go!