javascript中++和+ = 1之间的差异

时间:2013-06-21 18:20:36

标签: javascript increment

有人可以解释为什么以下函数会给出不同的结果。第一个似乎不起作用,但第二个确实有效。我很困惑,因为我认为+ = 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相同的结果 - 我希望括号在返回之前“强制”它被评估。知道为什么不是这样吗?

8 个答案:

答案 0 :(得分:14)

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

否则+++=1

相同

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

答案 1 :(得分:5)

  

return (base++)

     

我现在感到惊讶的是,这并没有给出与函数2相同的结果 - 我希望括号在返回之前“强制”它被评估。知道为什么不是这样吗?

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

return base++;

是后增量。它增加base所持有的值,然后在增量发生之前返回原始值。

return base += 1;

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

return ++base;

答案 4 :(得分:2)

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

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'

答案 5 :(得分:1)

只是澄清一点。

“变量+ = 1”相当于“变量=变量+ 1”。它不等于变量++!

类似变量++的东西可以就地使用,前者是分配。

答案 6 :(得分:1)

在第一个函数中会发生什么:

return base++; //返回第一个基值,然后递增。

在第二个功能:

return base+=1; //这里首先完成增量,然后返回变量。

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

答案 7 :(得分:1)

小心:

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

等于:

y = 1 * 10 + 1 = 11

确实:

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

等于:

y = 2 * 10 + 1 = 21;

完成:

++ x;

x ++;

没有区别!