
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
3.8 for...of
JavaScript开发人员经常遇到的一个错误是:for...in不能迭代数组成员。但是,它会迭代传入对象的键名。如下面的例子所示,你期望得到9,2,5,但是实际得到了索引0,1,2。

这就是for...of存在于TypeScript和ES6中的原因。在下面的迭代中,它能按你的预期去迭代数组。

与此相似,在TypeScript中使用for...of迭代字符串是没有任何问题的。


1.生成JavaScript
对于目标为ES6之前的编译版本来说,TypeScript中的for...of代码将会被编译成标准的for(var i=0;i<list.length;i++)循环,上面的例子编译生成的内容如下所示。

你可以看到在使用for...of时,目的会更明确,且需要编写的代码量,以及你需要提供的变量名称也会减少。
2.限制
如果你的编译目标不是ES6及其之后的版本,编译生成的代码会假定对象上存在属性长度,并且可以通过数字来索引对象。例如obj[2]。因此它只支持传统JavaScript引擎上的string和array。
如果TypeScript了解到你并没有使用array或string,将会抛出一个错误提示:不是arrayo类型或string类型的。


你应该只把for...of用于已经确定的数组或字符串上。注意,将来的TypeScript版本可能会删除此限制。
3.小结
你可能会惊讶于迭代数组元素的次数。下次当你想这样做时,就让for...of来替你完成吧。这可能会让审核你的代码的人感到高兴。