Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does this JS work out odd or even

Whilst reading Javascript Allonge I got stuck trying to figure out why this;

((n) => {
  const even = (x) => {
    if (x === 0)
      return true;
    else
      return !even(x - 1);
  }
  return even(n)
})(97)

returns true of false depending on the number supplied being odd or even.

When I look at it I think it is checking if the number supplied is 0 and if not subtracting 1 then checking again. This would mean the number eventually reached 0 and returns true. This is obviously NOT what is happening as for 97 it returns false and 96 true.

The only thing I don't know here is the bang before even in return !even(x -1);.

like image 611
leonormes Avatar asked Mar 10 '23 23:03

leonormes


1 Answers

Oh, this is terrible, in a wonderful kind of way. What a way to write code to check for odd and even numbers!

The first thing to note is that this is a recursive function: it calls itself repeatedly. Each time, it decrements the number concerned, so it eventually gets all the way down to 0.

The "clever" thing that this code does is the !, which inverts the boolean result of the function call. true becomes false and false becomes true. You can do this repeatedly: !!true is true and !!!true is false.

Essentially, this code can be reduced to something like the following:

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!true;

If there are an even number of ! negations, we end up with true. If there are an odd number, we end up with false.

The code you cite adds n ! logical NOT operators to true, where n is the value that we're testing. An odd number of !s results in false; an even number results in true.

This is clever code: it is not good code to use in production! It's somewhere in the region of 1200 times slower than the simple % 2 test.

like image 82
lonesomeday Avatar answered Mar 16 '23 15:03

lonesomeday