【问题标题】:Difference between ++ and +=1 in javascriptjavascript中++和+=1的区别
【发布时间】:2013-06-18 23:26:21
【问题描述】:

有人能解释一下为什么以下函数会给出不同的结果吗?第一个似乎不起作用,但第二个起作用。我很困惑,因为我认为 +=1 和 ++ 做了同样的事情。

(我不打算实际使用这段代码,只是为了演示区别)。

/*function 1*/
function incrementIfZero1(base,element) {

    if (element == 0) {
        return base++;
    }
    else
    {
        return base;
    }
};


/*function 2*/
function incrementIfZero2(base,element) {

    if (element == 0) {
        return base+=1;
    }
    else
    {
        return base;
    }
};

incrementIfZero1(1,0) /* -> 1*/
incrementIfZero2(1,0) /* -> 2*/

非常感谢任何帮助。

谢谢,

罗宾

[编辑:]

感谢您的回复,现在说得通了。我还尝试了以下语句,结果与函数 1 相同:

return (base++)

我现在很惊讶这并没有给出与函数 2 相同的结果——我原以为括号会“强制”在返回之前对其进行评估。知道为什么不是这样吗?

【问题讨论】:

  • 感谢您的快速回复 - 请参阅底部的编辑以了解其他相关问题

标签: javascript increment


【解决方案1】:

当你return base++ 时,它会在它递增之前返回 base 的值。你想做++base 以确保增量首先发生然后它被返回

否则+++=1 相同

[edit] 作为对您的编辑的回应,我尝试将随机语句包装在括号中,并且大多数数学运算符都按预期响应,这种增量似乎是豁免的,可能是因为预增量与后增量的语法是高度有意的,并且语句本身返回一个特定的值,无论您是否将其括在括号中

【讨论】:

  • 谢谢 - 我想我明白了。所以 return (x++) 与 return x++ 相同,因为两者都不涉及对 x 的赋值,所以它们都说:“返回 x 然后加一”。而 return x+=1 表示“将 x+1 分配给 x 并返回 x 的结果值”。
  • @RobinL 表达式 x++ 返回x(到return 语句,它将它从函数返回到外部)然后递增它。表达式x+=1 递增x,然后返回它。
【解决方案2】:

return (base++)

我现在很惊讶这并没有给出与函数 2 相同的结果——我原以为括号会“强制”在返回之前对其进行评估。知道为什么不是这样吗?

递增操作 被评估,无论括号如何。这里的问题是 JavaScript 中的表达式总是产生一个值,然后返回。例如,当您执行var x = 2 + 2 时,会评估2 + 2,然后“返回”给= 运算符,然后将该值分配给x++ 后缀运算符(如base++)的工作方式不同:它确实递增它前面的变量,但表达式返回递增前的值。另一方面,前缀增量运算符可以按您的意愿工作,++base 在递增后返回值。

【讨论】:

  • 我知道这与其他答案大多是多余的,但我希望它可以帮助您理解它为什么会这样。
  • 感谢您的回答 - 它确实添加了有用的附加信息,说明为什么 return x++ 和 return (x++) 之间没有区别。
【解决方案3】:

您正在返回base++。这是后缀增量,因此,增量在返回后处理。对于这种特定情况,return ++base; 是正确的

【讨论】:

【解决方案4】:
return base++;

是后增量。它对base持有的值进行递增,然后返回递增发生前的原始值。

return base += 1;

将基数加一,然后返回基数。这是一个预增量。这也可以写成:

return ++base;

【讨论】:

  • 你确定 "base += 1;"是预增量而不是后增量?
【解决方案5】:

警告!使用+++= 对两种不同的类型(字符串和数字)进行变异时会有所不同:

count 是一个字符串时,count += 1 似乎进行类型转换并将第二个数字转换为字符串,而count++ 接受字符串count 参数,转换为一个数字,并递增 1。

let count = process.argv[2]

while (count < 5) {
  console.log('Inside of the loop. Count is', count)
  count += 1 // NOT likely what you want! Now, try it with count++
}

console.log('Outside of loop. Count is', count)

另一个例子:

> let num = '2'
undefined
> num++
2
> num
3

// VS using +=

> let num2 = '2'
undefined
> num2 += 1
'21'
> num2
'21'

【讨论】:

    【解决方案6】:

    只是澄清一点。

    “variable += 1”等价于“variable = variable + 1”。它不等同于变量++!

    variable++之类的东西可以原地使用,前者是赋值。

    【讨论】:

      【解决方案7】:

      在第一个函数中发生的是:

      return base++; // 首先返回基值,然后递增。

      在第二个功能中:

      return base+=1; //这里先递增,再返回变量。

      速记分配具有更高的优先级,即它在该行本身完成它的工作

      【讨论】:

        【解决方案8】:

        小心:

        x = 1; y = (x++ * 10 + 1);

        等于:

        y = 1 * 10 + 1 = 11

        确实:

        x = 1; y = (++x * 10 + 1);

        等于:

        y = 2 * 10 + 1 = 21;

        完成:

        ++x;

        x++ ;

        没有区别!

        【讨论】:

          猜你喜欢
          • 2011-08-15
          • 2011-07-09
          • 2019-09-07
          • 2018-08-05
          • 2013-01-19
          • 2011-02-27
          • 1970-01-01
          • 2022-10-01
          • 1970-01-01
          相关资源
          最近更新 更多