Symbol.iterator 为每一个对象定义了默认的迭代器。该迭代器可以被 for…of 循环结构使用。
一些内置的类型如 Array,Map,Set,String,Int32Array,Uint32Array 等都已经实现了各自的 Symbol.iterator。 对象上的 Symbol.iterator 函数负责返回供迭代的值。
for..of会遍历可迭代的对象,调用对象上的Symbol.iterator方法。
let someArray = [1, "string", false]; for (let entry of someArray) { console.log(entry); // 1, "string", false }
for..of 和 for..in 均可迭代一个列表;但是用于迭代的值却不同,for..in 迭代的是对象的键的列表,而 for..of 则迭代对象的键对应的值。
let list = [4, 5, 6]; for (let i in list) { console.log(i); // 输出:0, 1, 2 } for (let i of list) { console.log(i); // 输出:4, 5,6 }
另一个区别是 for..in 可以操作任何对象;它提供了查看对象属性的一种方法。 但是 for..of 关注于迭代对象的值。内置对象 Map 和 Set 已经实现了 Symbol.iterator方法,可以访问它们保存的值。
当生成目标为 ES5 或 ES3,迭代器只允许在 Array 类型上使用。 在非数组值上使用 for..of 语句会得到一个错误,就算这些非数组值已经实现了Symbol.iterator 属性。
当目标为兼容ECMAScipt 2015的引擎时,编译器会生成相应引擎的 for..of 内置迭代器实现方式。