Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript-因子化';对于循环';理解力_Javascript_For Loop - Fatal编程技术网

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; }

我正在完成一些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);
函数因式分解(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;
}