JavaScript-因子化';对于循环';理解力
我正在完成一些JavaScript算法挑战,我不得不将一个数字分解为其中的一部分。在搜索堆栈和其他位置后,我输入了正确的代码块:JavaScript-因子化';对于循环';理解力,javascript,for-loop,Javascript,For Loop,我正在完成一些JavaScript算法挑战,我不得不将一个数字分解为其中的一部分。在搜索堆栈和其他位置后,我输入了正确的代码块: function factorialize(num) { if(num === 0) { return 1; } if(num < 0 ) { return undefined; } for(var i = num; --i; ) { num *= i; }
function factorialize(num) {
if(num === 0) {
return 1;
}
if(num < 0 ) {
return undefined;
}
for(var i = num; --i; ) {
num *= i;
}
return num;
}
factorialize(5);
函数因式分解(num){
如果(num==0){
返回1;
}
if(num<0){
返回未定义;
}
对于(var i=num;--i;){
num*=i;
}
返回num;
}
因子化(5);
它返回正确的结果。然而,我很难理解为什么for循环没有第二条语句,为什么它可以永远运行?我有一点头绪,这是因为只要
I
值为0
,随后生成的任何负数都将乘以0,因此只有整数才会形成结果。但是,如果循环仍然运行到-无穷大,并且在达到某个值时没有被告知停止,那么为什么函数会返回一个有效的数字呢?通常您会:
for(var i = 0; i < num; i++)
第二个仍然是布尔连续表达式,当我得到0时,它的计算结果为false。for循环表达式中的所有元素都是可选的 for循环的第二部分用于表示for循环的条件。在每次迭代中都会对该条件求值,当其求值为false时,将退出循环 在这种情况下,表示条件的第二部分是
--i
。这意味着在每次迭代中,i
将递减1,直到它最终达到零(0)。因为0在Javascript中被认为是一个错误的值,所以循环将退出。for(a;b;c)
直接等同于
a;
while (b) {
c;
}
你在这里错了,因为你似乎认为c
是决定循环结束的因素,而b
实际上是决定循环结束的因素。如果不需要第三个循环语句(以及第一个循环语句),可以省略它
在这里,您的循环相当于:
var i = num;
while (--i) {
num *= i;
}
而(--i)
做两件事:
- 减量
(在任何其他之前)i
- 检查
i!=0(这是实际循环条件)
i--
,请注意操作将按相反的顺序进行
如果您发现代码难以阅读,也可以这样编写,以获得相同的结果:
for (var i = num - 1; i != 0; i--) {
num *= i;
}
for
循环的第二部分是条件:
在每次循环迭代之前要计算的表达式。若该表达式的计算结果为true,则执行该语句。此条件测试是可选的。如果省略,则条件的计算结果始终为true。如果表达式的计算结果为false,则执行将跳到for构造后面的第一个表达式
一旦--i
达到0,它将计算为false
(false),并且的将退出
将console.log(i)
添加到for循环将有助于演示这一点
它没有第三条语句。。。这就足够了。。。第二条语句在i为1时中断循环(即--i将为0)。。。for循环被定义为for([初始化];[条件];[最终表达式])
。。。条件是测试循环是否应该继续运行的条件,只要它评估truthy,循环就会继续。初始化在第一个循环之前运行一次,终结在每个循环结束时运行。感谢Robby,这很有意义,这很有意义
for (var i = num - 1; i != 0; i--) {
num *= i;
}