【问题标题】:i-- and i = i-1 not evaluating the samei-- 和 i = i-1 评估不同
【发布时间】:2015-01-02 13:01:05
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • --i 是相关的

标签: javascript evaluation


【解决方案1】:

当您执行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,你可以说它的作用类似于前缀减量运算符,在这种情况下,但i--第一次评估while 中使用的条件 时仍然是1,然后当第二次检查while 条件 时,它是@ 987654332@,这是 falsey,因此循环结束。

【讨论】:

  • 感谢您的示例和--j 运算符。我不知道这个存在。
  • @Afterlame 很高兴能帮上忙 :)
【解决方案2】:

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

【讨论】:

  • “只有在执行第一个循环后才会评估 i--。” - 不,i 将在评估循环条件后递减,但 在循环内的语句之前。
  • @nnnnnn 感谢您的评论。我会更新我的帖子。
  • 也就是说while(i--) {…}while (i) {i-=1;}本质上是一样的?
  • @Afterlame - while(i--){}while(i) {i-=1;} 不太一样,因为如果 i 在 while 语句之前为 0,那么在前者之后它将为 -1,即使循环没有运行;在后者之后i 仍然是 0。
  • 是的。首先i的原始值用于决定是否执行循环,然后i的值被改变,然后(可能)循环体将被执行。
【解决方案3】:

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

请参阅文档here

【讨论】:

  • 删除了对 PHP 文档的引用(我没有阅读问题)。添加了对 JavaScript 文档的引用。
【解决方案4】:

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

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

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

你可以想到

while (i--) {...}

相当于

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

【讨论】:

  • 您的“等效”操作并不真正等效。对于i--,值在循环体运行之前递减(但在评估循环条件之后)。
  • 我知道,刚刚修好。谢谢。
  • 不幸的是,更新后的版本仍然不等价,因为while(i--) 在更改i 之前评估条件,但您的do/while 评估条件之后 更改i .
  • @nnnnnn 是的,但脚本将显示完全相同的行为。
  • 对不起,新版本只有在到达while语句之前i不为0时才等效。我不确定是否有一种简单、整洁的方法来重写while(i--),因为即使循环体没有运行,它也会始终递减 i。更容易记住它是如何工作的,并在适当的地方使用--i。 (再次,抱歉 - 我不是试图让人讨厌。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多