为了检查我的理解,我们是否只有在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");
}
}
}
}
答案 0 :(得分:3)
不要在嵌套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");
}
}
}
}
答案 1 :(得分:2)
对内部和外部循环使用相同的循环计数器i
是不好的做法。这只是令人困惑,导致不可预测的行为。
但是既然你已经这样做了,你想知道会发生什么:
当内循环第一次结束时,i
的{{1}}中的row.length
值将为row
。然后,matrix
将由外循环递增。如果i
的新值为i
您的>=
变量,那么外部循环将立即结束。否则,outerloop将继续使用新值n
并执行以下行:
i
如果var row = matrix[i];
大于或等于i
,matrix.length
变量将为row
,那么当你到达内循环并尝试测试undefined
您正在测试row.length
,这会给您一个错误并停止执行。
但是,如果undefined.length
小于或等于i
,那么内循环将“运作”,意味着再次使用新值matrix.length
和{{1在第一次迭代时设置回row
。
如果前一行的长度恰好与其索引减去1相同,那么同一行将一直反复处理。
基本上,外部循环的每次迭代都会根据前一行的长度选择一个或多或少随机(可能未定义)的行来继续。