Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript increment while assigning

I was having a conversation about the prefix increment operator, and we seem to have run into a disagreement.

When running this code:

var x = 0;
x = ++x;

is the second line equivalent to:

  • x = (x = x + 1) OR
  • x = (x + 1)

It is hard to tell the difference because the results are identical (both result in x having a value of 1)

I believe that the value is not saved to the original variable when the left hand side of the assignment is the variable itself.

My counterpart disagrees and thinks the value is saved to the original variable whenever the ++ operator is used.

Which one of us is right?

like image 592
Asad Saeeduddin Avatar asked Nov 26 '12 12:11

Asad Saeeduddin


2 Answers

It is saved, so it is similar to the first example. Take for example this code:

var v = 0;
v = ++v + ++v + ++v;
// Returns 6

That is because this will translate to:

v = (0+1) + ((0+1)+1) + (((0+1)+1)+1);

Or, to be more accurate:

v = 0+1 +
v = 1+1 + //Previous value of v + 1
v = 2+1   //Previous value of v + 1

Why?

++v will first save the incremented value of v, then it will return this incremented value.
To simplify things, try this in your console:

x = 0;
++x;

If ++x would resolve to x + 1, the value of x would now still be 0, right?
Nope, your x will be 1. This means that ++x must have a assignment operator in there.

like image 70
Cerbrus Avatar answered Sep 19 '22 08:09

Cerbrus


Just try writing both ++x and x++ out in full English sentences:
++x: increment x by one and return the value
x++: return the value of x, and increment it.

Your second line (x = ++x;) is equivalent to x = (x += 1), yes.
Just look at any loop you've ever written:

for (var i = 0;i<100;i++)//<-- no need for another assign here

So you could've written ++x; all the same, but since that expression is the entire statement, it makes no difference if you write x++; or ++x...

As you probably know xxsomeVar increments the variable by 1, assigns the resulting value to that variable and then returns it, someVar++ returns the current value of the variable, and then increments it by 1 (the new value is assigned to the variable, too, of course).

So ++x; is the equivalent of x = (x + 1);

From the Language specs:
++prefix increment operator
Postfix++ increment operator

like image 36
Elias Van Ootegem Avatar answered Sep 21 '22 08:09

Elias Van Ootegem