我认为i--
是i = i - 1
的简写,但我发现两者都评价不同:
var i = 1;
while (i = i - 1) {…}
在这种情况下,i
是0
,其评估为false
。这按预期工作。
var i = 1;
while (i--) {…}
i
应该是0
并评估为false
,但事实并非如此。它评估为true
。这是一个错误,还是有原因的?
只有在评估循环条件之后但在循环内的语句之前,才会评估i--
。这是递减后缀运算符。这意味着最初在循环条件下对条件的评估将是true
。这将触发循环体中语句的执行。当循环体中的语句将被执行时,由于i
已经减1,它将等于0.因此,循环条件的评估将是false
,并且循环体中的语句将不会再次执行。
当你执行i--
时,使用i
的值然后递减。但是在前缀--1
运算符的情况下,它是不同的,因为它将被递减然后使用。
var i = j = 1;
console.log(i--); // still 1
console.log(i); // now 0
console.log(--j) // 0
console.log(j); // again 0
为了向您展示在使用预修复和后期修复操作符时实际落后的情况,尽管它并不主要关注这个问题,但我认为最好知道。
i = i - 1
做的是它在遇到代码后立即进行评估,所以i
实际上是0
,你可以说它的作用类似于pre-fix递减运算符,在这种情况下,但是当i--
中使用的条件被评估时,1
仍然是while
第一次,然后当第二次检查while
条件时,它是0
,这是假的,因此循环结束。
您应该使用--i
as预减量运算符。
请参阅文档here
当在循环中使用时,i--
与i=i-1
不同。
i--
将在条件之后进行评估,但在循环内容运行之前,而i=i-1
将在条件之前进行评估,因此将评估为false。
我想在这方面--i
更类似于i=i-1
,因为它也在条件之前进行了评估。
你可以想到
while (i--) {...}
相当于
while (i = i - 1, i + 1) {...}