如何将 JavaScript for 循环转换为 CoffeeScript?

Posted

技术标签:

【中文标题】如何将 JavaScript for 循环转换为 CoffeeScript?【英文标题】:How can I convert a JavaScript for-loop to CoffeeScript? 【发布时间】:2011-11-12 08:01:38 【问题描述】:
for (i = 0; i < 10; i++) 

    doStuff();


这是我要转换为 CoffeeScript 的 javascript 代码。

【问题讨论】:

也试试js2.coffee 【参考方案1】:
doStuff() for i in [0 .. 9]

这在介绍页有说明:http://coffeescript.org/#loops

JP 编辑/更新:

准确的翻译是:

doStuff() for i in [0...10]

您需要小心“..”与“...”,例如:

count = 0
doStuff() for i in [0..count] #still executes once!

所以你认为,没问题...我会一直循环直到 count-1!

count = 0
doStuff() for i in [0..count-1] #executes twice!! '0' and then '-1'

直译:

for (var i = 0; i < someCount; ++i)
  doStuff()

for i in [0...someCount]
  doStuff()   

【讨论】:

对,或者直译过来,for i in [0...10]。两个点 (..) 表示“最多但不包括”,而三个点 (...) 表示“最多但不包括”。这是一种 Ruby 主义。 范围运算符源自Perl,它对Ruby 产生了很大影响。不确定是 Perl 发明了它们还是继承自另一种古老的语言。 @JP 如果你在循环中引入一个变量,代码的行为会有所不同。例如,它将确定运行时计数器应该走哪条路。 0 .. 0 应该执行一次。 0 .. -1 应该执行两次。 @Bengt 完全正确。我认为修改答案很重要,这样互联网搜索者就不会感到困惑。 AFAIR,CoffeeScript 文档对此并不清楚。我被它烧了,我不想要别人。我认为我的其他示例为人们阐明了这一点。【参考方案2】:

标记的答案在功能上是正确的,但生成的代码与原始 javascript 不匹配。正确的方式(阅读,最接近以下 javascript 的方式)

for (i = 0; i < 10; i++) 
  doStuff();

doStuff() for i in [0..someCount] by 1 注意 for 循环中的 by 1

现在这段代码,仍然创建了一个额外的_i 变量。如果您无法忍受,请使用以下内容:

i=0
while i<=someCount
  doStuff()
  i++

【讨论】:

【参考方案3】:

以前的答案有效。但是,删除 i 对我来说会更好:

for [0...10]
  doStuff()

doStuff() for [0...10]

其他解决方案添加一个额外的迭代器变量i 供您在循环内部使用,例如doStuff(i),但来自http://coffeescript.org/v1/#loops:

如果你不需要当前的迭代值,你可以省略它:

browser.closeCurrentTab() for [0...count]

具体来说,for i in [0...10] 的翻译是for (i = j = 0; j &lt; 10; i = ++j),而for [0...10] 的翻译是for (i = 0; i &lt; 10; i++)

请注意其他 cmets 中关于 2 点与 3 点的讨论([0..9][0...10])。

【讨论】:

以上是关于如何将 JavaScript for 循环转换为 CoffeeScript?的主要内容,如果未能解决你的问题,请参考以下文章

如何将for循环转换为map函数

如何将此代码转换为 for 循环格式?

如何将for循环输出转换为列表?

如何将 JavaScript forEach 循环/函数转换为 CoffeeScript

如何将 For 循环结果转换为数组,然后在 C# 中计算结果数组的整数?

如何将此列表理解转换为 for 循环,但我不能 [重复]