DEV Community is a community of 665,497 amazing developers

We're a place where coders share, stay up-to-date and grow their careers.

Swap two numbers without using a temporary variable

Mehul Lakhanpal
Full stack Developer | Micro-blogging on Web Development at codedrops.tech | Creator of File Ops, Note Box, GitHub Marker
Originally published at codedrops.tech ・1 min read
``````let x = 5, y = 3;
x = x + y;
y = x - y;
x = x - y;
console.log(x, y); // 3 5
``````

Micro-Learning ● Web Development ● Javascript ● MERN stack ● Javascript

codedrops.tech

Discussion (17)

Sami

isn't there a more clever way to do this?

nnowwakk

There certainly is. The way in the post only works for numbers and not even very large numbers (the sum of a + b has to be less than MAX_SAFE_INTEGER) but applying the destructuring assignment is the simplest and cleanest way in my opinion.

let a = 1;
let b = 2;

[a, b] = [b, a];

a; // => 2
b; // => 1

Clay Ferguson

Not to be negative, but something like this would never be used in production code because the overhead of constructing arrays will be significantly larger than the standard approach of a temp variable.

It's more important that the CPU do less work than to save a line of code. Also, in general 10 lines of simple to read code is always preferable to 1 line of more complex to read code, all other things being equal. Some developers get concerned with counting lines of code, and that's not what matters.

Steven Than

I disagree, this code is highly readable. In fact, you'll feel right at home if you come from python world. The following piece of code to swap 2 variables is consider pythonic:

``````a, b = b, a
``````

If you're worry allocating a temporary array causing performance issue, then you should stay away from JavaScript in the first place

Junxiao Shi

The temporary array is most likely optimized away.

Steven Than

That's almost certain, iirc most of the array related code are written C++, at least for Chrome's V8 anyway

NoMoreDeps

Destructuring is a good candidate to swap values.

I agree with @wclayferguson that we need to avoid an overhead, but in the other hand, the first class citizen in Javascript is the Object. Even a function is an object in Js.

You will not have more overhead with an array than any other object in fact.

Its more a question of syntax style in the case of destructuring, the temporary variable is the Array but it still acts as an anonymous temporary variable of the same kind at a low level.

Clay Ferguson • Edited

It depends on what the variables being swapped hold also, to know performance. If you're swapping two primitives (which are not objects) and you use a temp variable, then there is never any heap memory allocate calls at all, because it's all done on the stack. Any time you do something that causes Objects to get created you're putting a load on the memory allocate, and slowing down the eventual garbage collection etc.

My rule of thumb is never do something the slow way intentionally just because it's slightly more elegant code. As long as the code is clear, the clarity itself is the elegance.

And BTW: I'm not saying a temp variable create calls the allocator. It doesn't. I'm saying creating arrays calls the allocator.

NoMoreDeps

Yeah I do agree, It works exactly as you describe in .Net, and other managed languages :-).

Just saying that in JS destructuring is syntactic sugar, I worked 5 years making 2D game frameworks for online lottery games, so can only agree. I think it can be tolerated if it is not done in a heavy statment, like a loop etc. Just my opinion by the way.

Clay Ferguson

My first 10 years of work was C++, so I know a thing or two about stacks and heaps. haha, and I did agree with everything you were saying.

NoMoreDeps

I know we were agree from the begining ha ha, I started coding professionally almost 20 years ago with c++ / c# and JS at the same time (My brain must be a little damaged lol), I hope we master a bit heap, stacks and memory allocation even in managed languages loool.

But it is good to remember how optimization works, and always keep in mind that the way we write code does impact heavily the way it will run.

I remember when I learned in c++ to use a 1 dimensional array as it was a 2 one for performance reason, and then understood that in JS an Array ... is not an Array... but an object with numerical key as properties... No comment... Ha ha ha ha (Until you use a real array like a TypedArray for sure). Definition of fun BTW...

NoMoreDeps

Did I really wrote "We were agree", sorry for that, I will return to school to re learn grammar :-)

Clay Ferguson

We probably have a similar belief on most things, sounds like. I branched off to Java in 1998, and never touched C#. I never forgave Bill Gates for trying to "hijack" Java with his Windows proprietary version of the language, and not until recently and because of VSCode and TypeScript did I personally find forgiveness for MSFT.

Phippsy

That is beautiful.

Phippsy

Great post. Cool trick! Thanks for introducing me to codedrops.tech!

Serious question though - why would you avoid using the temporary variable?

``````let x = 5, y = 3, temp = null;
temp = x;
x = y;
y = temp;
console.log(x,y);  // 3 5
``````

Just about the same number of characters, more clear what is being done.

Ken Bellows

This is a very old school trick that is still useful on contexts like embedded development where you have very limited memory available.

Mehul Lakhanpal

I too feel it has no real-world application. Limited memory would be possible when used in Embedded Systems. And I feel this is more of a logical question.