JavaScript is an easy to learn programming language. It’s easy to write programs that run and does something. However, it’s hard to account for all the uses cases and write robust JavaScript code.
In this article, we’ll look at ways to check for unexpected values, including null
and NaN
.
Checking for null
null
is also a value that we may unexpectedly encounter, so we should also check for that.
Checking for null
is a bit tricky since we can’t use the typeof
operator to check for null
as typeof null
returns 'object'
.
However, we can still use the ===
operator or the Object.is
method to check for null
.
We can use the ===
operator to check for null
as follows:
if (foo === null) {
//...
}
In the code above, we just use the ===
operator to check for null
as we would do for any other value.
The ===
operator doesn’t do any data type coercion, so it’ll compare the value as-is with any data type conversions before doing the comparison.
Therefore, the code above will work for null
comparisons since it doesn’t try to convert null
to anything else before doing the comparison.
Object.is
is a static object method that takes 2 arguments that take 2 objects that are to be compared.
It’ll return true
is both arguments are null
, so we can use that for checking if something is null
.
To check for null
with Object.is
, we can write the following code:
if (Object.is(foo, null)) {
//...
}
In the code above, we called Object.is
with foo
and null
. Then if foo
is null
, Object.is
will return true
.
Check if a Value is NaN
NaN
is a value that we’ll encounter if we try to convert something that’s not a number into a number or if we try to divide 0 or a non-number by 0.
There’re many ways to check for NaN
, including the isNaN
function, the Number.isNaN
method, and Object.is
.
The ===
and ==
operators won’t work because NaN
is considered to be different from itself if we use these operators. Therefore NaN === NaN
and NaN == NaN
both return false
.
However, there’re still many options to check for NaN
.
The globalisNaN
function can be used to check if a value is NaN
or not. Data type coercion is done before checking for NaN
with this function.
If we pass in something that will be NaN
if we convert it to a number, then isNaN
will return true
. Otherwise, it’ll return false
.
For instance, if we have:
isNaN(NaN);
isNaN(undefined);
isNaN({});
then they all return true
since they all return NaN
if we try to convert them to a number.
On the other hand, if we have:
isNaN(true);
isNaN(null);
These will return true
since true
coerces to 1 and null
coerces to 0 before being compared with isNaN
to check if it’s NaN
.
Also, the following returns true
:
isNaN('456ABC');
since parseInt(‘456ABC’);
returns 456
, but Number('456ABC')
returns NaN
.
The Number.isNaN
function checks if a value is NaN
but doesn’t try to convert it to a number before doing the comparison. This method is new to ES2015.
For instance, we can use that for comparing value as follows:
Number.isNaN(NaN);
Number.isNaN(Number.NaN);
Number.isNaN('foo' / 0);
Number.isNaN(0 / 0);
They all return true
since all the expressions that we put into the argument are evaluated to NaN
.
Anything that isn’t NaN
will return false
, so expressions like:
Number.isNaN('foo');
will return false
in addition to numbers in the argument. It only checks if the value is NaN
without trying to convert a number first.
Likewise, we can use the Object.is
method to check if a value is NaN
. Like Number.isNaN
, it won’t try to do any data type coercion before doing the equality comparison with NaN
.
Object.is
considers NaN
to be equal to itself, so we can use it to check for NaN
.
Therefore, we can use it as we do with isNaN
. For instance, we can write:
Object.is(NaN, NaN);
Object.is`(Number.NaN, NaN);` Object.is`('foo' / 0, NaN);
`Object.is`(0 / 0, NaN);`
will all return true
. Anything that isn’t explicitly evaluated as NaN
will returns false
when comparing against NaN
will Object.is
. For instance:
Number.isNaN('foo');
returns false
.
Conclusion
Checking for null
and NaN
have their own tricks. We can use ===
to check for null
, in addition to Object.is
.
To check for NaN
, we can’t use ===
to check for NaN
as NaN === NaN
returns false
. However, we can use Object.is
, isNaN
or Number.isNaN
to do the comparison.