JavaScript - Factorialization'For Loop'理解?

时间:2016-08-03 10:21:26

标签: javascript for-loop

我正在完成一些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并且在达到某个值时没有被告知停止?

4 个答案:

答案 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。