Why is there an isNaN()
function in JavaScript whilst isUndefined()
must be written as:
typeof(...) != "undefined"
Is there a point I don't see?
In my opinion its really ugly to write this instead of just isUndefined(testValue)
.
Why is there an isNaN()
function in JavaScript whilst isUndefined()
must be written as:
typeof(...) != "undefined"
Is there a point I don't see?
In my opinion its really ugly to write this instead of just isUndefined(testValue)
.
There is simply no need for an isUndefined()
function. The reason behind this is explained in the ECMAScript specification:
(Note that the NaN value is produced by the program expression NaN.) In some implementations, external code might be able to detect a difference between various Not-a-Number values, but such behaviour is implementation-dependent; to ECMAScript code, all NaN values are indistinguishable from each other.
The isNaN()
function acts as a way to detect whether something is NaN
because equality operators do not work (as you'd expect, see below) on it. One NaN
value is not equal to another NaN
value:
NaN === NaN; // false
undefined
on the other hand is different, and undefined
values are distinguishable:
undefined === undefined; // true
If you're curious as to how the isNaN()
function works, the ECMAScript specification also explains this for us too:
- Let num be ToNumber(number).
- ReturnIfAbrupt(num).
- If num is NaN, return true.
- Otherwise, return false.
A reliable way for ECMAScript code to test if a value X is a NaN is an expression of the form X !== X. The result will be true if and only if X is a NaN.
NaN !== NaN; // true
100 !== 100; // false
var foo = NaN;
foo !== foo; // true
The use case var === undefined
works almost everywhere, except for the cases covered by this answer, where either undefined
is assigned a value, or var
is undefined.
The reason such a function cannot exist, is clear from the latter case. If var
is undefined, then calling the supposed function isUndefined(var)
will result in a ReferenceError
. However introducting a new keyword, e.g. isundefined var
could address this issue.
But despite being valid, both of the above cases are poor uses of javascript. This is the reason I believe such a keyword does not exist.
isUndefined
could be written as
testValue === undefined
like for every other value.
This does not work with NaN
however, as NaN !== NaN
. Without the ability to use a comparison, there was need for an isNaN
function to detect NaN
values.
This isn't a direct answer to the question as others have already answered, it's more to highlight libraries that contain an isUndefined() function for anybody looking for quick solution and they're in a position to use them.
Underscore and Lo-dash both contain an isUndefined() function, the latter, because it's built upon Underscore.