28

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

4

8 回答 8

25

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

否则+++=1

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

于 2013-06-21T18:22:35.247 回答
6

return (base++)

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

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

于 2013-06-21T18:38:13.460 回答
5

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

于 2013-06-21T18:24:14.990 回答
5
return base++;

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

return base += 1;

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

return ++base;
于 2013-06-21T18:25:03.790 回答
3

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

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'
于 2017-12-06T20:19:18.830 回答
2

只是为了澄清一点。

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

变量++之类的东西可以就地使用,前者是赋值。

于 2013-06-21T18:25:55.423 回答
1

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

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

在第二个功能中:

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

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

于 2013-06-21T18:26:10.623 回答
0

小心点 :

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

等于 :

y = 1 * 10 + 1 = 11

的确 :

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

等于 :

y = 2 * 10 + 1 = 21;

完成 :

++x;

或者

x++ ;

没有区别!

于 2013-06-23T10:38:18.987 回答