i-- 和 i = i-1 的评估不一样

i-- and i = i-1 not evaluating the same

本文关键字:评估 不一样 i-1 i--      更新时间:2023-09-26

我以为i--i = i - 1的简写,但我发现两者的计算不同:

var i = 1;
while (i = i - 1) {…}

在这种情况下,i0 ,其计算结果为 false 。这按预期工作。

var i = 1;
while (i--) {…}

i应该0并评估false,但事实并非如此。它的计算结果为 true 。这是一个错误,还是有原因?

当你执行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

为什么要解释上述内容?

向您展示使用pre-fix和post-fix运算符时实际上发生了什么,虽然它主要不关心这个问题,但我认为最好知道一下。

现在实际答案

i = i - 1所做的是一旦遇到代码就会进行评估,所以i实际上是0,在这种情况下,你可以说它的行为类似于前缀递减运算符,但是当第一次计算while中使用的条件时,i--仍然是1,然后在第二次检查while条件时, 它是0,这是假的,因此循环结束。

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

您应该使用 --i 作为递减前运算符。

在此处查看文档

i--

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

i--将在条件之后但在运行循环内容之前进行评估,而i=i-1将在条件之前进行评估,因此计算结果为 false。

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

你可以想到

while (i--) {...}

相当于

while (i = i - 1, i + 1) {...}
相关文章: