i-和i = i-1没有评估相同

问题描述 投票:0回答:4

我认为i--i = i - 1的简写,但我发现两者都评价不同:

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

在这种情况下,i0,其评估为false。这按预期工作。

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

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

javascript evaluation
4个回答
2
投票

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


4
投票

当你执行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,这是假的,因此循环结束。


1
投票

您应该使用--ias预减量运算符。

请参阅文档here


-1
投票

当在循环中使用时,i--i=i-1不同。

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

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

你可以想到

while (i--) {...}

相当于

while (i = i - 1, i + 1) {...}
© www.soinside.com 2019 - 2024. All rights reserved.