中年男人自学js的跬步之行,错的我自己都乐了...
自己练习for循环打乘法表,一路披荆斩棘,错误无数,状况百出,在此记录,以示后人。
for(heng = 1;heng <= 9;heng++){
for(shu = 1;shu <= heng;shu++){
console.log(shu+' * '+heng+' = '+shu*heng)
}
}
运行后发现结果是这样
然后想找一个不换行的命令,没找到...
参考网上的方法,加了一个str变量,想把这个乘法表加到一个字符串里打印,完整代码如下:
let str = '';
for(heng = 1;heng <= 9;heng++){
for(shu = 1;shu <= heng;shu++){
str += shu+' * '+heng+' = '+shu*heng;
}
}
console.log(str);
运行后是这样,没有换行...
于是在第6行加了换行(原来在第5行大括号后面加的,发下command+/注释掉的时候连着括号一起注释掉了,所以要单独一行),代码如下:
let str = '';
for(heng = 1;heng <= 9;heng++){
for(shu = 1;shu <= heng;shu++){
str += shu+' * '+heng+' = '+shu*heng;
}
console.log('\n');
}
console.log(str);
运行后结果是这样,还是没有换行,只是运行了9遍...
用谷歌浏览器断点调试测试分析得知:
26行之前正确输出了1*1=1,但是没有console.log(str),都存在缓存里,到了27打印了个换行,就有返回23继续循环了,如此反复了9次,打印了9个27行(换行),才最终打印了29行,所以出现了截图效果。
想着:把29提到27前面,先打印,再回车,是不是就可以了?
let str = '';
for(heng = 1;heng <= 9;heng++){
for(shu = 1;shu <= heng;shu++){
str += shu+' * '+heng+' = '+shu*heng;
}
console.log(str);
console.log('\n');
}
结果如下,只对了2行,从第3行就开始抽风:
继续断点调试:
分析如下,第一次打印后,进入第二次循环时,str已经包含了1*1=1,因为用了+=,所以每次打印都带着上一次的结果。那把+=改成=试试呢?
代码如下:
let str = '';
for(heng = 1;heng <= 9;heng++){
for(shu = 1;shu <= heng;shu++){
str = shu+' * '+heng+' = '+shu*heng;
}
console.log(str);
console.log('\n');
}
醉了...结果如下:
继续断点调试...
因为没有+=,只有=,所以每次都是第二个for里shu++之后大于heng(73行for范围和变化那里)了,才跳出循环,所以只打印跳出循环前最后生成的字符串...
没想法了,看了眼别人写好的,原来新建的空字符串是在第一层循环和第二层循环之间定义的,太难了...我感觉这不看答案根本想不到啊,大家都很容易的写出来了么,这个会写多了慢慢就好了么,还是就真的笨啊...
最终代码如下:
for(heng = 1;heng <= 9;heng++){
let str = '';
for(shu = 1;shu <= heng;shu++){
str += shu+' * '+heng+' = '+shu*heng+' ';
}
console.log(str);
console.log('\n');
}
终于成功了:
.....然后无意间又看到有heng&shu相等时加换行的写法,理解思路了,有时间也试试,看看能怎么千奇百怪的错,怎么五彩斑斓的改的.......脑子是个好东西,可惜咱没有啊!!