破晓之空
2016-10-10 04:26
如图所示,,为什么我第16行屏蔽会得到正确答案,而不屏蔽就会循环出这么多不需要的答案啊?
这个问题可能当面讲很好理解,通过打字有点难说清,我试着说说
首先明确,你的代码中嵌套了三个 for 循环,
for(var i=0;i<infos.length;i++) //我们设为 A for(var j=0;j<infos[i].length;j++) //我们设为 B for(var k=0;k<infos[i].length;k++) //我们设为 C
其实可以看到,你的 B 和 C 两个循环是一样的,有冗余,这里先不讨论,先解释为什么出现你说的现象。
你的 B 循环内,C 循环之前有两句代码,
if(infos[i][j]=="大一") document.write(infos[i]+"<br/>");
document 这一句就是你的第 16 行,我们简称 16,16 未屏蔽时,是属于 if 语句体的,而后面的 C 循环则是独立于 if 语句,不受 if 的影响,所以每当 B 循环一次,C 都要完整的循环 4 次,这 4 次 C 的循环会打印一个 小A,(这里我们先拿 小A 举例,其他的类推),而 B 一共会循环 4 次,所以 C 就会打印出 4 个 小A,在第 4 次打印 小A 之前,if 语句条件满足,会走 16,所以先打印一次数组。
当 16 屏蔽,由于 if 未加大括号 {},会默认将紧随其后的一句代码归入 if 语句体,这里的 C 循环是一个整体,紧随 if 之后,所以被归入 if 语句体,那么也就是说,只有当 if 语句条件满足时,C 循环才会发生。而在 B 循环的 4 次循环中,if 语句只会满足一次,就是 “大一” 那次,这时 C 发生 4 次循环,打印一个 小A,然后 B 循环结束,A 循环进入下一次循环。所以最后你得出的结果是正确的。
你的代码没必要这样写,在课程下面的 “同学代码”中,有很多同学的代码,都写得不错,你可以看看,参照一下。
for(var i=0;1<infos.length;i++){
if(infos[i][3]="大一"){
if(infos[i][1]="女生'"){
document.write("infos[i][0]") ;
}
}
}
for(var j=0;j<infos[i].length;j++){
if(infos[i][j]=="大一")
document.write(infos[i]+"<br/>");
这里的代码是判断一行中所有符合你的条件“大一”的一个循环,你设置你每循环一次就打印一次
因为你是在循环里面输出数组信息啊,除了16行还有20行。其实不需要那么麻烦的,用一个循环和一个判断语句就可以完成这个练习了。
JavaScript进阶篇
468061 学习 · 21891 问题
相似问题