技术分享

使用TypeScript开发微信小程序(7)——迭代器(Iterator)


Symbol.iterator 为每一个对象定义了默认的迭代器。该迭代器可以被 for…of 循环结构使用。

一些内置的类型如 Array,Map,Set,String,Int32Array,Uint32Array 等都已经实现了各自的 Symbol.iterator。 对象上的 Symbol.iterator 函数负责返回供迭代的值。

for..of

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..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 内置迭代器实现方式。

参考资料

  • TypeScript官网
  • TypeScript中文网

其他

  • 完整代码:https://github.com/guyoung/GyWxappCases/tree/master/TypeScript
  • 微信小程序Canvas增强组件WeZRender:https://github.com/guyoung/WeZRender