TypeScript筆記:迭代器和生成器(八)
阿新 • • 發佈:2018-11-08
-
可迭代性
當一個物件實現了Symbol.iterator
屬性時,我們認為它是可迭代的。 一些內建的型別如 Array
,Map
,Set
,String
,Int32Array
,Uint32Array
等都已經實現了各自的Symbol.iterator
。 物件上的Symbol.iterator
函式負責返回供迭代的值。
for .. of語句
for..of
會遍歷可迭代的物件,呼叫物件上的Symbol.iterator
方法。 下面是在陣列上使用 for..of
的簡單例子:
let someArray = [1, "string", false]; for (let entry of someArray) { console.log(entry); // 1, "string", false }
for .. of vs. 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
方法,讓我們可以訪問它們儲存的值。
let pets = new Set(["Cat", "Dog", "Hamster"]);
pets["species"] = "mammals";
for (let pet in pets) {
console.log(pet); // "species"
}
for (let pet of pets) {
console.log(pet); // "Cat", "Dog", "Hamster"
}
-
程式碼生成
當生成目標為ES5或ES3,迭代器只允許在Array
for..of
語句會得到一個錯誤,就算這些非陣列值已經實現了Symbol.iterator
屬性。
編譯器會生成一個簡單的for
迴圈做為for..of
迴圈,比如:
let numbers = [1, 2, 3];
for (let num of numbers) {
console.log(num);
}
生成的程式碼為:
var numbers = [1, 2, 3];
for (var _i = 0; _i < numbers.length; _i++) {
var num = numbers[_i];
console.log(num);
}