Javascript for loop with iterator In the middle and decrement operator to the left of i?

Javascript for loop with iterator In the middle and decrement operator to the left of i?

对于阶乘函数的非递归示例,我找到了这个示例并且在跟踪代码时遇到了一些困难:

function fact(x) {
   if(x == 0) {
       return 1;
   }
   if(x < 0 ) {
       return undefined;
   }
   for(var i = x; --i; ) {
       x *= i;
   }
   return x;
}

我不明白这个for循环的语法--为什么迭代语句在中间,那不应该是测试条件通常所在的地方吗?这是否意味着没有测试条件或没有迭代语句?您可以省略一个或两个吗?

其次,在 for 循环中使用 ++i--ii++i-- 有什么区别?

如果我想在 for 循环的第一次迭代中找到 fact(5)i 是 4 还是 5?

在js中,0表示false,其他值如1表示true。

why is the iteration statement in the middle

for(var i = x; --i; /* optional */ )
               ^^ its decrement as well as the condition
                 loop continues until, i is 0

事实上,您可以创建无限循环

for(;;);

I wanted to find fact(5), in the first iteration of the for loop, is i 4 or 5?

for(var i = x /* i=5 */; --i/* i=4 */; ) {
       x *= i;/* i=4 */
   }

在 JavaScript 中,0 计算为 false。这里所做的是省略循环的迭代部分,让测试部分自己执行迭代。 --i 首先将 i 的值减 1,然后 for 循环对其求值,只有当它不是 0.

时才执行

i----i的区别在于--i先对i减1再对i求值,而i--先对i求值再对i求值一世。 例如:

var i=5;
console.log(i--);

将打印 5,而:

var i=5;
console.log(--i);

将打印 4.

我猜 for 循环中有问题,好像您正在尝试获取数字的 factorial,当它达到 2 时您应该停止减少数字。 所以 for 循环应该是这样的

for(var i = x; i > 2;--i) {
    x *= i;
}

另外第一个if语句应该是

if(x == 0 || x == 1) {
    return 1;
}

i----i的区别在于

i-- 在循环迭代结束时递减 i--i 在迭代开始前递减它。

所以在第一次迭代中 i 等于 4 当你试图获得 fact(5).