我正在完成一些JavaScript算法挑战,我不得不将一个数字因子化作为其中一个的一部分。在搜索堆栈和其他地方后,我输入了正确的代码块:
function factorialize(num) {
if(num === 0) {
return 1;
}
if(num < 0 ) {
return undefined;
}
for(var i = num; --i; ) {
num *= i;
}
return num;
}
factorialize(5);
它返回正确的结果。然而,我正在努力理解的是为什么for循环没有第二个语句,为什么它可以永远运行?我有一个问题,因为只要i
值为0
,生成的任何后续负数将乘以0,因此只有整数才会形成结果。但是,为什么函数返回一个有效的数字,如果循环仍在运行到-infinity并且在达到某个值时没有被告知停止?
答案 0 :(得分:2)
for
循环的第二部分是条件:
在每次循环迭代之前要计算的表达式。如果此表达式的计算结果为true,则执行语句。此条件测试是可选的。如果省略,则条件始终计算为true。如果表达式的计算结果为false,则执行将跳转到for构造后面的第一个表达式。
--i
达到0后,评估为false
( falsey ),for
“退出”
在for循环中添加console.log(i)
将有助于演示
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for
答案 1 :(得分:1)
for循环表达式中的所有元素都是可选的。
for循环的第二部分用于表示for循环的条件。在每次迭代时评估条件,当评估为false时,退出循环。
在这种情况下,表达条件的第二部分是--i
。这意味着在每次迭代时,i
将递减1,直到它最终达到零(0)。由于在Javascript中0被视为 falsey 值,因此循环退出。
答案 2 :(得分:1)
for (a; b; c)
直接等同于
a;
while (b) {
c;
}
你在这里错了,因为你似乎认为c
决定了循环的结束,但b
实际上是。{1}}。如果不需要,可以省略第三个循环语句(以及第一个循环语句)。
在这里,你的循环相当于:
var i = num;
while (--i) {
num *= i;
}
while (--i)
做了两件事:
i
(在其他任何事情之前)i != 0
(这是实际的循环条件)。如果是i--
,请注意操作将以相反的顺序完成。
如果您发现难以阅读的代码,您也可以这样写它以获得相同的结果:
for (var i = num - 1; i != 0; i--) {
num *= i;
}
答案 3 :(得分:0)
通常你会:
for(var i = 0; i < num; i++)
第二个语句是布尔延续表达式。 所以,当你有
for(var i = num; i--;)
第二个仍然是一个布尔延续表达式,当我得到0时,它被评估为false。