Javascript Nonsense

Saw this online and then thought about it more and it cuts to the representation of numbers in bytes in binary quite clearly.

Given that you have two numeric variables how do you swap the values?

let firstNumber = 1;
let secondNumber = 2;

Output

> let firstNumber = 1
> let secondNumber = 2
> firstNumber
1
> secondNumber
2

Introduce a variable

let tempNumber = firstNumber;
firstNumber = secondNumber;
secondNumber = firstNumber;

Output

> let firstNumber = 1
> let secondNumber = 2
> let tempNumber = firstNumber;
> firstNumber = secondNumber;
> secondNumber = firstNumber;
> secondNumber = tempNumber
> firstNumber
> 2
> secondNumber
> 1

Implict swap with an Array

let firstNumber = 1
let secondNumber = 2
[firstNumber, secondNumber] = [secondNumber, firstNumber]

This technique leverages destructuring assignment

Output

> [firstNumber, secondNumber] = [secondNumber, firstNumber]
> firstNumber
2
> secondNumber
1

Bitwise XOR

let firstNumber = 1
let secondNumber = 2
firstNumber ^= secondNumber
secondNumber ^= firstNumber
firstNumber ^= secondNumber

Output

> firstNumber ^= secondNumber
> secondNumber ^= firstNumber
> firstNumber ^= secondNumber
> firstNumber
2
> secondNumber
1

Why does that last one work? Well because the number is stored in bytes and the bytes are composed of bits.  The representation of 1 = 00000001 standard 8 bit byte and 2 = 00000010

Now doing an exclusive or XOR operation which means only 1 bit can be on or off when combined

Input 1 Input 2 Output
1 1 0
1 0 1
0 1 1
0 0 0

Going to use 4 bit nibbles for following binary math instead of longer 8 bit bytes above

So 1 XOR 2 = 3

0001
0010
----
0011

Then 2 XOR 3 = 1

0010
0011
----
0001

Then 3 XOR 1 = 2

0011
0001
----
0010

This solution seems insightful to me because it gets to the core of how data is bound by the base abstraction (this abstraction is pushed up from the physical legacy hardware of on/off switches)