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


Answers:


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!

所以你想,没问题...我会一直循环直到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()   

26
是的,或者按字面意思翻译for i in [0...10]。两个点(..)表示“不超过”,而三个点(...)表示“不超过但不包括”。这是一种红宝石主义。
Trevor Burnham

范围运算符源自对Ruby产生重大影响的Perl。不确定Perl是发明它们还是从另一种古老的语言继承而来。
matyr 2011年

@JP好吧,如果您在循环中引入变量,则代码的行为将有所不同。例如,它将确定运行时计数器应该走哪条路。0 .. 0应该执行一次。0 .. -1应该执行两次。
jontro 2011年

@Bengt准确。我认为修改答案很重要,这样互联网搜索者就不会感到困惑。航空方面,CoffeeScript文档尚不清楚。我被它烧死了,我不要别人。我认为我的其他示例可以为人们阐明这一点。
JP理查森,

19

标记的答案在功能上是正确的,但生成的代码与原始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++

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]vs. [0...10])的讨论。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.