You can initialize two variables to the same value at once, kinda:
var foo, bar;
foo = bar = 10;
But there is no similarly easy mechanism to add, say, 5 to both foo
and bar
at the same time. Of course, it’s simple enough to just do:
foo += 5; // foo is now 15
bar += 5; // bar is now 15
But that’s two operations.
The trick is:
foo += -bar + (bar += 5);
// foo and bar are now 15
You will probably never need this, it’s just interesting to know it’s possible.
Thanks to Matheus Avellar for sending in this little mindbending trick, who also explains:
The
-bar
gets parsed and becomes the negative value ofbar
, so -10. Then,a += 5
runs and setsbar
to 15 (10 + 5). Finally, it sums up both values (-10 + 15) and gives you the difference between oldbar
and newbar
, which is 15.
Or like this :)
‘foo = bar += 5’ would just set ‘foo’ equal to ‘bar + 5’.
@William, this is what Chris wants. He wants to initialize both variables with 10:
Then add 5 to each of them:
Every math operation returns its new value:
@Kevin in the example he set both to 10 but the exercise is all about what if you have 2 different variables and you want them both to go up by 5.
It’s stuff like this that supports Douglas Crockford’s idea of making JavaScript fully extensible: “With the same ease that we can define new variables, we (could) let the programmer add new operators and new statements.” http://javascript.crockford.com/tdop/tdop.html
Yup, that works fine, thanks for the tip. I don’t understand what William is saying by telling that it wont work.
If I saw something like that in code I’d probably spend next two hours trying to understand why.
Code like this is written only for education, not production.
You say about
foo += 5; bar += 5;
:However,
foo += -bar + (bar += 5);
is worse in that regard, since that’s FOUR operations. You could reduce it to three withfoo -= bar - (bar += 5)
, with the added advantage of making your code even more inscrutable.