我正在尝试在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
时实现行为
答案 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
删除队列的第一个元素。