JavaScript, comparing numbers and null

Last time I’m programming quite a lot in JavaScript. And I discovered this kind of inconsistency when comparing a null value with numbers. Let’s consider this code in JavaScript:

var x = null;
var y = ... // some number

console.info('Comparing null with: ', y);
console.info('lt: ', x < y);
console.info('gt: ', x > y);
console.info('eq: ', x == y);
console.info('lte: ', x <= y);
console.info('gte: ', x >= y);

I was assuming null value compared to numbers will behave in a way somehow similar to that like NULL is behaving in SQL. Or at least I was assuming all above comparing expressions will be evaluated to false. The reality is even worse! Results are depending on a number which is value of y variable.

For y = 3 we get:

Comparing null with: 3
lt: true
gt: false
eq: false
lte: true
gte: false

So it looks null is considered in JavaScript to be less than 3.

For y = 0 we get:

Comparing null with: 0
lt: false
gt: false
eq: false
lte: true
gte: true

Total nonsense! null is not less than 0 and is not equal to 0 but… it’s less or equal to 0.

For y = -3 we get:

Comparing null with: -3
lt: false
gt: true
eq: false
lte: false
gte: true

At least we know JavaScript “thinks” null is greater than a negative number! 🙂

The conclusion is that you must be very cautious with null value in JavaScript. It should not be compared with numbers as results are against the logic.

Disclaimer: I was executing JavaScript in console of Firefox ver. 50.

Solution

If you need to compare a variable against numbers in JavaScript and it’s possible this variable can be null then all these comparing expressions should use parseInt(x) instead of x. The value of parseInt(null) is NaN (not-a-number) which behaves nice (in line with common reason) when compared to numbers. So now we have:

console.info('Comparing null with: ', y);
console.info('lt: ', parseInt(x) < y);
console.info('gt: ', parseInt(x) > y);
console.info('eq: ', parseInt(x) == y);
console.info('lte: ', parseInt(x) <= y);
console.info('gte: ', parseInt(x) >= y);

Now all these expressions will evaluate to false no matter what number is the value of variable y.

NOTE: If your variable (like x in the example above) is going to hold floating-point numbers then use parseFloat instead of parseInt. 