循环中coffeescript的奇怪行为

时间:2014-08-06 13:45:19

标签: coffeescript iterator

我正在尝试在CoffeeScript中迭代数组但是存在某种奇怪的行为。 例如,查看此代码:

kapa = [1]
for i in kapa
    console.log 't'
    kapa.push 1

我希望这段代码在控制台中产生无限的't'符号序列。但实际上它只打印一个't'。 这种行为背后的逻辑是什么? 我怎样才能达到预期的行为? 说明:

elements= [1]
for i in elements
    proccess(element)
    if someCond
      newElement = ...
      element.push(newElement) #

我希望在处理所有newElement时实现行为

2 个答案:

答案 0 :(得分:1)

它只打印一次的原因是因为coffeescript编译成这个JS:

var i, kapa, _i, _len;

kapa = [1];

for (_i = 0, _len = kapa.length; _i < _len; _i++) {
  i = kapa[_i];
  console.log('t');
  kapa.push(1);
}

因此它在开始时计算数组的长度,并且在kapa.push(1)时不会更新。我会说这是预期的行为,而且,在迭代它时修改数组听起来像个坏主意。在Java等其他语言中,如果你试图这样做,你会得到一个例外。

如果你真的希望它每次打印无限t并将1推送到数组上,你需要一个无限循环:

kapa = [1]
while true
  console.log( 't' )
  kapa.push( 1 )

(但这显然令人气馁,我不确定你为什么会这样做)

更新

根据更新的问题,您可以将数组用作类似队列的结构

elements= [1]
while nextElem = elements.shift()
    proccess(nextElem)
    if someCond
      newElement = ...
      elements.push(newElement)

答案 1 :(得分:1)

鉴于您添加的解释,可能您正在将阵列用作队列:

elements= [1]
while elements.length
    proccess(elements.shift())
    if someCond
      newElement = ...
      element.push(newElement)

注意使用while循环(在每次迭代时评估其结束条件),以及elements.shift删除队列的第一个元素。