Javascript i--i=i-1,计算结果不一样

Javascript i--i=i-1,计算结果不一样,javascript,evaluation,Javascript,Evaluation,我以为I--是I=I-1的缩写,但我发现两者的计算结果不同: var i=1; 而(i=i-1){…} 在本例中,i为0,其计算结果为false。这正如预期的那样有效 var i=1; 而(我…){…} i应该是0并计算为false,但它不是。它的计算结果为true。这是一个bug,还是有原因?只有在计算循环条件之后,但在循环中的语句之前,才会计算i--。这是递减后缀运算符。这意味着循环条件中的条件最初的计算结果将是true。这将触发循环体中语句的执行。当循环主体中的语句将被执行时,由于i已

我以为
I--
I=I-1
的缩写,但我发现两者的计算结果不同:

var i=1;
而(i=i-1){…}
在本例中,
i
0
,其计算结果为
false
。这正如预期的那样有效

var i=1;
而(我…){…}
i
应该是
0
并计算为
false
,但它不是。它的计算结果为
true
。这是一个bug,还是有原因?

只有在计算循环条件之后,但在循环中的语句之前,才会计算
i--
。这是递减后缀运算符。这意味着循环条件中的条件最初的计算结果将是
true
。这将触发循环体中语句的执行。当循环主体中的语句将被执行时,由于
i
已被减1,因此它将等于0。因此,循环条件的计算结果将为
false
,循环体中的语句将不会再次执行。

仅在计算循环条件之后,但在循环中的语句之前,才会计算
i--
。这是递减后缀运算符。这意味着循环条件中的条件最初的计算结果将是
true
。这将触发循环体中语句的执行。当循环主体中的语句将被执行时,由于
i
已被减1,因此它将等于0。因此,循环条件的计算结果将为
false
,循环体中的语句将不会再次执行。

执行
i--
时,使用
i
的值,然后递减。但是对于前缀
--1
运算符,它是不同的,如中所示,它将被递减然后使用

为什么要解释上述情况? 当你使用pre-fix和post-fix操作符的时候,我会告诉你后面到底发生了什么,虽然这并不主要关心这个问题,但我认为最好知道

现在是实际答案
i=i-1
所做的是它在遇到代码时立即求值,因此
i
实际上是
0
,可以说它的作用类似于预固定减量运算符,在这种情况下,但是当第一次计算
while
中使用的条件时,
i--
仍然是
1
,当第二次检查
while
条件时,它是
0
,这是错误的,因此循环结束。

,使用
i
的值,然后递减。但是对于前缀
--1
运算符,它是不同的,如中所示,它将被递减然后使用

为什么要解释上述情况? 当你使用pre-fix和post-fix操作符的时候,我会告诉你后面到底发生了什么,虽然这并不主要关心这个问题,但我认为最好知道

现在是实际答案
i=i-1
所做的是它在遇到代码时立即求值,因此
i
实际上是
0
,可以说它的作用类似于预固定减量运算符,在这种情况下,但是当第一次计算
中使用的条件时,
i--
仍然是
1
,当第二次检查
中使用的
条件时,它是
0
,这是错误的,因此循环结束。

您应该使用
--i
作为预减量运算符

参见文档

您应该使用
--i
作为预减量运算符

参见文档

i--
在循环中使用时与
i=i-1
不同

i--
将在条件之后但在循环内容运行之前求值,而
i=i-1
将在条件之前求值,因此求值为false

我想在这方面,
--I
更类似于
I=I-1
,因为它也是在条件之前进行评估的

你可以想到

while (i--) {...}
等同于

while (i = i - 1, i + 1) {...}
在循环中使用时,
i--
i=i-1
不同

i--
将在条件之后但在循环内容运行之前求值,而
i=i-1
将在条件之前求值,因此求值为false

我想在这方面,
--I
更类似于
I=I-1
,因为它也是在条件之前进行评估的

你可以想到

while (i--) {...}
等同于

while (i = i - 1, i + 1) {...}

--i
是相关的
--i
是对PHP文档的相关删除引用(我没有读这个问题)。添加了对JavaScript文档的引用。删除了对PHP文档的引用(我没有读这个问题)。添加了对JavaScript文档的引用。“只有在执行第一个循环后才会计算i-。-否,
i
将在计算循环条件后,但在循环中的语句之前递减。@nnnnnn感谢您的评论。我将更新我的帖子。这意味着
while(I--){…}
本质上与
while(I){I-=1;}
?@Afterlame-
while(I--){}
while(I--=1;}
不完全相同,因为如果
i
在while语句之前为0,那么在前者之后为-1,即使循环体没有运行;在后者之后,
i
仍然是0.Yes。首先使用
i
的原始值来决定是否执行循环,然后更改
i
的值,然后(可能)将执行循环体。“只有在执行第一个循环后才会计算i-”-否,
i
将在计算循环条件之后,但在