【问题标题】:Why does `for...of` in Typescript copy the iterable object before looping?为什么Typescript中的`for...of`在循环之前复制可迭代对象?
【发布时间】:2017-10-21 03:31:00
【问题描述】:

例如:

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

被转译为:

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

aKeys_1 这里有什么意义?

您还可以在 Typescript 游乐场here 中实时查看此内容。

【问题讨论】:

  • 因为你用 let 而不是 var
  • @toskv 我想的很接近,但在操场上试试。不正确。
  • @OmarAlshaker,因为数组也可以是a.b.c.d("lorem ipsum").e[42],而不是aKeys。如果你不缓存你正在迭代的数组,你可能会遇到麻烦。

标签: javascript typescript for-of-loop


【解决方案1】:

因为你可以在循环体中重新分配aKeys,它不应该影响迭代。当然,当你时没有必要,但是转译器并不确定。

一般来说,正如@Thomas 在 cmets 中观察到的那样,表达式必须只计算一次 - 虽然很容易看到它不会对 const 变量的引用产生影响,但一般来说不是就这么简单。

【讨论】:

  • 我认为通过检查循环块可以很容易地知道,不是吗?还是只是因为某些原因没有实施?
  • @MadaraUchiha 可以确定一些个代码块(但not in general for all programs)。当在某处遇到eval 时,它需要退出,而且任何函数调用都需要追踪副作用等。所以,是的,“原因”——即使一些简单的案例确实是微不足道的。就像 aKeys 被声明为 const。嗯。
猜你喜欢
  • 2017-02-08
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 2011-07-27
  • 2013-10-15
相关资源
最近更新 更多