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