js中for循环的那些事
事情起因
在平时练习封装一个10进制数转任意进制数的函数时(利用简单的栈结构实现),里面有一个步骤是把10进制数每次除以目标进制数的余数push进栈里。此时书中的做法是用到了while循环代码如下:
//假设 number值为4 base值为2
//书中写法:
while (number > 0) {
console.log(number, 'number'); //此处number值为4 2 1
rem = Math.floor(number % base)
stack.push(rem)
number = Math.floor(number / base)
}
//第一次尝试将while循环改为for循环
for (number > 0; number = Math.floor(number / base);) {
console.log(number, 'number');//此时number的值为2 1
rem = Math.floor(number % base)
stack.push(rem)
}
分析原因
当没有在for循环括号内初始化变量值的时候(且在for循环外声明变量并且赋值)而你使变量自增的语句又是赋值语句时(a=a+1 而不是 a ++)此时for循环第一次会把你用于自增/减的赋值语句当做循环变量的初始化语句,对循环变量进行赋值所以第一次进去进行了一次赋值 及 number = Math.floor(number/base) = 2 而此时while 语句number的值依旧为4
验证
//改造之后的for循环
for (let i = number; i > 0; i = Math.floor(i / base)) {
console.log(i, 'i');//此时i的值为 4 2 1
rem = Math.floor(i % base)
stack.push(rem)
}
最后用一个更简单的例子来证实
var a = 4
for (a > 0; a = a - 1;) {
console.log(a);//打印每次循环A的值( 3 2 1 )
}
for (let i = a; i > 0; i = i - 1) {
console.log(a);//打印每次循环A的值(4 3 2 1 )
}
while (a > 0) {
console.log(a);//(4 3 2 1 )
a = a - 1
}
结语
还不知道,是不是因为JavaScript语言本身的原因,后续还需要更多的验证。(写了自己人生第一篇博客,加油!)