2017-05-21 69 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

相关问题