2017-05-21 74 views
2

例如:爲什麼在Typescript中`for ... of`在循環之前複製可迭代對象?

const aKeys = []; 
for (let key of aKeys) { 
... 
} 

是transpiled到:

var aKeys = []; 
for (var _i = 0, aKeys_1 = aKeys; _i < aKeys_1.length; _i++) { 
    var key = aKeys_1[_i]; 
} 

什麼的aKeys_1這裏的要點?

您還可以在Typescript遊樂場here中查看此活動。

+0

因爲你使用let而不是var – toskv

+0

@toskv我想過的東西很近,但是在操場上試了一下。不對。 –

+2

@OmarAlshaker,因爲不是'aKeys',數組也可以是'a.b.c.d(「lorem ipsum」)。e [42]'。如果你不緩存正在迭代的數組,你可能會遇到麻煩。 – Thomas

回答

3

因爲你可以在循環體中重新分配aKeys,它不應該影響迭代。當然你沒有必要當你不要,但轉譯員不知道肯定。

而且一般來說,正如@Thomas在評論中觀察到的那樣,表達式只能被評估一次 - 儘管看到它對變量const的引用沒有什麼不同,但通常情況並非如此簡單。

+0

我認爲通過檢查循環的塊可以很容易地知道它,不是嗎?還是僅僅因爲原因而沒有實施? –

+1

@MadaraUchiha可以確定* some *代碼塊(但[對所有程序通常不是](https://en.wikipedia.org/wiki/Halting_problem))。當遇到'eval'時,它需要紓困,而且任何函數調用都需要追溯到副作用等等。所以,是的,「原因」 - 即使一些簡單的情況確實應該是微不足道的。像'ake''被聲明爲'const'。呃。 – Bergi

相關問題