为了验证我的理解,我们是否认为以下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.length
则row
变量将被undefined
,因此当您到达内部循环并尝试测试row.length
时,您正在测试undefined.length
这将给您一个错误并停止执行。
但是,如果i
小于或等于matrix.length
则内部循环将在某种意义上"工作",即使用新的 row
值再次运行,并在第一次迭代时将i
设置回 0
。
如果前一行的长度恰好与其索引减 1 相同,那么同一行将被永远一遍又一遍地处理。
因此,基本上,外部循环的每次迭代都会根据前一行的长度选择一个或多或少随机(并且可能未定义)的行继续。