对于每次迭代的循环值

时间:2014-06-05 16:06:16

标签: javascript

我不确定这些功能是否完全相同:

时:

  for (i=0, l=this.current_columns.length; i<l; i++) {
    if ( this.current_columns[i].text === row[0] ) {
        this.current_columns.splice(i, 1);
        EV.publish('edit_layout.current_columns', {data: [this.current_columns]})
        break;
    }
  }

等于:

  for (i=0; i<this.current_columns.length; i++) {
    if ( this.current_columns[i].text === row[0] ) {
        this.current_columns.splice(i, 1);
        EV.publish('edit_layout.current_columns', {data: [this.current_columns]})
        break;
    }
  }

最终的结果?

2 个答案:

答案 0 :(得分:3)

他们实际上做了同样的事情,但可能需要一些解释:

循环本身的不同之处在于数组的长度存储在第一个版本的变量中。

将长度存储在变量中意味着循环将运行到数组的原始长度,如果数组在循环内发生变化,那将是一个问题。

阵列恰好在循环中发生变化,但是之后你也有break;,这不是问题。循环结束,因此变量中的长度不再正确并不重要。

答案 1 :(得分:2)

这部分:

for (i=0, l=this.current_columns.length; i<l; i++) {

第一部分:i=0, l=this.current_columns.length执行一次,而i<l在每次迭代时执行。

因此,通常更好地预先计​​算环的边界。 但要小心,因为有时你的循环会修改它遍历的数组的长度,你可以选择:你是在每次迭代时计算数组的长度,还是修改il结果(如果删除元素l = l - 1i = i - 1