什么时候进行循环转义



为了验证我的理解,我们是否认为以下for循环只有在row.length < n时才永远不会转义(否则,循环可以转义)?

function someFunction (matrix,n) {
  for (var i = 0; i < n; i += 1) {
    var row = matrix[i];
    for (var i = 0; i < row.length; i += 1) {
      if (row[i] < 0) {
        alert("Something's wrong");
      }
    }
  }
}

不要在嵌套的 for 循环中使用相同的递增变量!

function someFunction(matrix,n) {
  for (var i = 0; i < n; i += 1) {
    var row = matrix[i];
    for (var i = 0; i < row.length; i += 1) {  //VERY BAD!!!
      if (row[i] < 0) {
        alert("Something's wrong");
      }
    }
  }
}

当内部循环完成第一个循环时,我将等于 row.length。这也将完成外部循环,它再次将 i 递增 1。因此,当外部循环开始第二次迭代时,你将得到 i=row.length+1。请改为执行以下操作:

function someFunction(matrix,n) {
  for (var i = 0; i < n; i += 1) {
    var row = matrix[i];
    for (var j = 0; j < row.length; j += 1) { //using j instead of i
      if (row[j] < 0) {
        alert("Something's wrong");
      }
    }
  }
}

内部和外部循环使用相同的循环计数器i是一种不好的做法。这只会令人困惑,并导致不可预测的行为。

但是既然你已经这样做了,你想知道会发生什么:

当内部循环首次完成时,i的值将从matrix中的第一个row开始row.length。 然后i将按外循环递增。如果这个新值 i >= n变量,则外部循环将立即结束。否则,外循环将继续使用新值 i 并执行以下行:

var row = matrix[i];

此时,如果i大于或等于matrix.lengthrow变量将被undefined,因此当您到达内部循环并尝试测试row.length时,您正在测试undefined.length这将给您一个错误并停止执行。

但是,如果i小于或等于matrix.length则内部循环将在某种意义上"工作",即使用新的 row 值再次运行,并在第一次迭代时将i设置回 0

如果前一行的长度恰好与其索引减 1 相同,那么同一行将被永远一遍又一遍地处理。

因此,基本上,外部循环的每次迭代都会根据前一行的长度选择一个或多或少随机(并且可能未定义)的行继续。

最新更新