JavaScript中的++someVariable与someVariable++有何区别?

209
在JavaScript中,您可以在变量名之前使用 ++ 运算符(预增量)或之后使用它(后增量)。这些方式在递增变量方面是否存在差异?

1
请参阅与语言无关的循环中i++和++i的区别? - Bergi
昨天我在阅读有关C/C++中错误假设的问题时,看到了这个回答。在所有情况下,我们能保证Javascript会以这种方式运行吗?或者您认为在更复杂的语句中使用增量语句是一种不好的做法吗? - palswim
前面的评论实际上是我在2010年发布的答案(一个非答案)。我已经删除了这个答案,但Jon Skeet曾回复说:“查看ECMA-262,它似乎被很好地规定了。”。 - palswim
@palswim 最好将它们作为独立语句使用,而不是在更复杂的语句中使用。保持它本身可以提高可读性并减少混淆。 - shieldgenerator7
7个回答

364

与其他语言相同:

  • ++x(前缀自增)的意思是“增加变量的值;表达式的值是最终值”
  • x++(后缀自增)的意思是“记住原始值,然后递增变量;表达式的值是原始值”

现在当作为一个独立的语句使用时,它们的意思是相同的:

x++;
++x;

当你在其他地方使用表达式的值时,差异就会出现。例如:

x = 0;
y = array[x++]; // This will get array[0]

x = 0;
y = array[++x]; // This will get array[1]

25
真倒霉,如果我没有停下来加载一个实用的 jsfiddle 答案,我几乎就能在你之前回答了。;-) - Chris
2
如果您使用+1而不是++,那么这会是什么样子?在添加数字时是否有一种在之前或之后递增的方法? - Keavon
1
我想知道为什么如果你执行这个操作 const r1 =(x++)+(x++); 它不会根据你的示例产生预期的结果。 - Jean Jimenez
5
@JeanJimenez说:“这段代码得到了我期望的结果。例如,如果x一开始是10,那么r1的值为21,即10加11。第一个x++表达式的值为10,x增加到11。第二个x++表达式的值为11,x增加到12。” - Jon Skeet
@JeanJimenez:它们都会增加x的值(这就是为什么如果x最初为10,则最终结果为12),并且在两种情况下,表达式的值都是在增加之前的x的值。(但是第二个x++当然是在第一个增量发生之后被评估的...) - Jon Skeet
显示剩余4条评论

83
  • ++x会先将变量加1,然后再使用这个值。
  • x++会先使用这个值,然后再将变量加1。
var n = 0, m = 0;

alert(n++); /* Shows 0, then stores n = 1 */
alert(++m); /* Shows 1, then stores m = 1 */

请注意,使用++x会带来轻微的性能优势,因为您会先读取变量,对其进行修改,然后对其进行评估和存储。相对于x++操作符,您需要先读取值,进行评估,修改它,然后再存储。


12

据我理解,如果您将它们作为单独的语句使用,则它们执行相同的操作。但如果您尝试将它们的结果输出为表达式,则它们可能会有所不同。尝试alert(i++)与alert(++i)以查看差异。i++在加法之前评估i,而++i在评估之前执行加法。

请参见http://jsfiddle.net/xaDC4/了解示例。


11

我对理解后置递增和前置递增有一种解释。所以我把它放在这里。

让我们将x赋值为0

let x = 0;

让我们从后缀自增开始

console.log(x++); // Outputs 0

为什么?

让我们来分解一下 x++ 表达式。

x = x;
x = x + 1;

第一条语句返回变量x的值,即0

当您在任何地方使用变量x时,将执行第二条语句

第二个语句返回表达式x+1的值,即(0+1)=1

请记住此时x的值为1

现在让我们开始使用预增

console.log(++x); // Outputs 2

为什么?

让我们拆解 ++x 表达式

x = x + 1;
x = x;

第一个语句返回 x + 1 表达式的值,即 (1 + 1) = 2

第二个语句返回变量 x 的值,即 2,因此 x = 2,并返回 2

希望这有助于您理解后增量和前增量的含义!


5
var a = 1;
var b = ++a;
alert('a:' + a + ';b:' + b); //a:2;b:2

var c = 1;
var d = c++;
alert('c:' + c + ';d:' + d); //c:2;d:1

jsfiddle


2
var x = 0, y = 0;

//post-increment: i++ returns value then adds one to it
console.log('x++ will log: ', x++); //0
console.log('x after x++ : ', x);    //1

//pre-increment: adds one to the value, then returns it
console.log('++y will log: ', ++y); //1
console.log('y after ++y : ', y);   //1

-1

如果可能的话,使用++i更清晰、更快:

  • ++i保证您使用的是i的一个值,除非您改变i,否则它将保持不变
  • i++允许使用一个在“不久的将来”会发生变化的i的值,如果可能的话,这是不可取的

当然,实际上并没有快多少,只是稍微快一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接