i-- 和 i = i-1 不评估相同
i-- and i = i-1 not evaluating the same
我认为 i--
是 i = i - 1
的 shorthand,但我发现两者的计算结果不同:
var i = 1;
while (i = i - 1) {…}
在这种情况下,i
是 0
,计算结果为 false
。这按预期工作。
var i = 1;
while (i--) {…}
i
应该是 0
并且求值为 false
,但它不是。它的计算结果为 true
。这是错误还是有原因?
i--
将仅在循环条件被评估之后被评估,但是 在 循环内的语句之前。这是递减后缀运算符。这意味着最初对循环条件中条件的评估将是 true
。这将触发循环体中语句的执行。当循环体中的语句将被执行时,由于 i
已经减一,它将等于 0。因此循环条件的评估将是 false
和语句中的循环体将不再执行。
当您执行 i--
时,使用 i
的值,然后 然后 递减。但是在前缀 --1
运算符的情况下,它是不同的,因为它将递减并使用 then。
var i = j = 1;
console.log(i--); // still 1
console.log(i); // now 0
console.log(--j) // 0
console.log(j); // again 0
为什么要解释以上内容?
向您展示当您使用前缀和 post-fix 运算符时实际发生了什么,虽然它不是主要关注的问题,但是我以为知道会更好。
现在是实际答案
i = i - 1
的作用是一遇到代码就求值,所以i
实际上是0
,可以说它的作用类似于前缀自减运算符,在这种情况下,但是当 while
中使用的 条件 第一次被评估时 i--
仍然是 1
,然后第二次评估while
condition 被检查,它是 0
,这是 falsey 因此循环结束。
您应该使用 --i
作为预递减运算符。
查看文档 here
在循环中使用时,i--
与 i=i-1
不同。
i--
将在条件 之后,但在循环内容为 运行 之前被评估 ,而 i=i-1
将被评估 在 条件之前,所以计算结果为假。
我想在这方面 --i
与 i=i-1
更相似,因为它也在条件之前进行评估。
你可以想到
while (i--) {...}
相当于
while (i = i - 1, i + 1) {...}
我认为 i--
是 i = i - 1
的 shorthand,但我发现两者的计算结果不同:
var i = 1;
while (i = i - 1) {…}
在这种情况下,i
是 0
,计算结果为 false
。这按预期工作。
var i = 1;
while (i--) {…}
i
应该是 0
并且求值为 false
,但它不是。它的计算结果为 true
。这是错误还是有原因?
i--
将仅在循环条件被评估之后被评估,但是 在 循环内的语句之前。这是递减后缀运算符。这意味着最初对循环条件中条件的评估将是 true
。这将触发循环体中语句的执行。当循环体中的语句将被执行时,由于 i
已经减一,它将等于 0。因此循环条件的评估将是 false
和语句中的循环体将不再执行。
当您执行 i--
时,使用 i
的值,然后 然后 递减。但是在前缀 --1
运算符的情况下,它是不同的,因为它将递减并使用 then。
var i = j = 1;
console.log(i--); // still 1
console.log(i); // now 0
console.log(--j) // 0
console.log(j); // again 0
为什么要解释以上内容?
向您展示当您使用前缀和 post-fix 运算符时实际发生了什么,虽然它不是主要关注的问题,但是我以为知道会更好。
现在是实际答案
i = i - 1
的作用是一遇到代码就求值,所以i
实际上是0
,可以说它的作用类似于前缀自减运算符,在这种情况下,但是当 while
中使用的 条件 第一次被评估时 i--
仍然是 1
,然后第二次评估while
condition 被检查,它是 0
,这是 falsey 因此循环结束。
您应该使用 --i
作为预递减运算符。
查看文档 here
i--
与 i=i-1
不同。
i--
将在条件 之后,但在循环内容为 运行 之前被评估 ,而 i=i-1
将被评估 在 条件之前,所以计算结果为假。
我想在这方面 --i
与 i=i-1
更相似,因为它也在条件之前进行评估。
你可以想到
while (i--) {...}
相当于
while (i = i - 1, i + 1) {...}