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

73
for (i = 0; i < 10; i++) {

    doStuff();

}

这是我想要转换成CoffeeScript的JavaScript代码。


也可以尝试使用 http://js2.coffee/ - PeterM
3个回答

115
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!

所以你认为,没问题...我只需要循环直到计数-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()   

27
正确的翻译是:“for i 在 [0...10] 内”。两个句点(..)表示“包括”,而三个句点(...)则表示“不包括”。这是 Ruby 的一个特性。注意保持原意,使语言更通俗易懂。 - Trevor Burnham
范围运算符源自Perl,它对Ruby产生了很大的影响。不确定Perl是发明了这些运算符还是从另一种古老的语言中继承而来。 - matyr
@JP 如果您在循环中引入一个变量,代码的行为将会有所不同。例如,它将在运行时确定计数器应该走哪个方向。0..0 应该执行一次。0..-1 应该执行两次。 - jontro
@Bengt 没错。我认为修改答案很重要,这样网络搜索者就不会感到困惑了。据我所知,CoffeeScript文档对此并不清楚。我曾经因此受过伤,我不希望别人也遭遇同样的问题。我认为我的额外示例可以让人们更好地理解这一点。 - JP Richardson

19

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

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

是这样的,在for循环中有一个 by 1 的设置。

如果你不能接受多出来的 _i 变量,那么可以使用以下代码:

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

1

之前的回答是正确的。然而,对我来说去掉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 < 10; i = ++j),而for [0...10]的翻译是for (i = 0; i < 10; i++)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接