for...of

菜鸟 JavaScript 程序员经历的一个普遍错误是对于数组的 for...in 不会遍历数组项。取而代之的是它遍历了你传过去对象的。如下所示。这里你想要 9,2,5 但是获得了索引 0,1,2

var someArray = [9, 2, 5];
for (var item in someArray) {
    console.log(item); // 0,1,2
}

这就是 for...of 存在于 TypeScript(和 ES6)的原因之一。下面正确地遍历了数组,跟设想一样输出了成员:

var someArray = [9, 2, 5];
for (var item of someArray) {
    console.log(item); // 9,2,5
}

同样的 TypeScript 使用 for...of 一个一个字符地遍历字符串没有任何困难:

var hello = "is it me you're looking for?";
for (var char of hello) {
    console.log(char); // is it me you're looking for?
}

JS 生成

对于 ES6 之前的目标,TypeScript 会生成标准的 for (var i = 0; i < list.length; i++) 类型的循环。例如这里是我们之前的例子生成的代码:

var someArray = [9, 2, 5];
for (var item of someArray) {
    console.log(item);
}

// 变成 //

for (var _i = 0; _i < someArray.length; _i++) {
    var item = someArray[_i];
    console.log(item);
}

你可以看到使用 for...of 使得意图更清晰,还减少了你不得不写的代码(和你需要思考的变量名)的数量。

缺陷

如果你的编译目标不是 ES6 或以上,生成的代码假设属性 length 存在于对象中而且对象能够用数字来索引,例如 obj[2]。所以对于遗留的 JS 引擎,它只支持字符串和数组。

如果 TypeScript 能看到你不是在是用数组或者字符串,它会给你一个清晰的错误 "is not an array type or a string type"

let articleParagraphs = document.querySelectorAll("article > p");
// Error: Nodelist is not an array type or a string type
for (let paragraph of articleParagraphs) {
    paragraph.classList.add("read");
}

只在那些你知道是数组或者字符串的东西上使用 for...of。需要注意的是这个缺陷在将来版本的 TypeScript 中可能会被移除。

总结

你会对于你会在数组中遍历元素的次数感到惊讶。下一次你想要遍历的时候,让 for...of 一展身手。你会让下一个审查你代码的人很开心。

results matching ""

    No results matching ""