1.1 - The source code examples here are on github
So now that we have some basic ways of knowing how to end up with NaN figured out lets look into the ways to go about knowing if we have a NaN value, and so forth.
1.3 - Not a Number is actually a Number
So when it comes to evaluating expressions, it is possible for a variable that should hold a number will in fact end up storing a string value. This is not always a problem if the string value can effectively be converted to a valid number value, unless for some reason it can not be, in which case the NaN value is a result. So this Not a Number value typically means that somewhere a string value failed to property convert to a Number value, and thus the value is Not a Number, but the type of NaN is still a Number. It is a bit confusing but the term Not a Number means the value from which the Number was converted from, rather than the type of the NaN value.
So because the NaN is a number methods that are part of the Number prototype can still be used with a NaN value such as the Number.isFixed method. In addition to this the fact that NaN is a number can be used to ones advantage when it comes to making a user space is NaN number. The type of the value can be checked first, and if the type if not number return false right away. After we have found that the value is not a string we can not convert the value to a String, and test if the result of that is equal to the string NaN if so return true. If all else fails assume that the type is number and that the value of the number is not NaN so return false.
1.2 - The NaN value does not equal itself
What is strange about NaN is that it does not equal anything, not even itself. Because of this it makes testing for NaN a little move involved then just using the equality or identity operators to do so. There is a well supported native method called isNaN, but also Number.isNaN both of which work differently, more on that later.
So now we have the basics of NaN out of the way. The NaN value is something that can end up happening as a result of an expression where proper filtering and type checking is not preformed. In addition if we have a NaN value ot is not always so easy to test for it, so special methods are needed to find out if a value is NaN or not.
This behavior may not be wrong necessarily because in a way values like undefined, and null are Not Numbers also of course. Still it may not really be the behavior that is expected when using a method called isNaN as often the expectation might be that the method should only return true when a value is NaN and only NaN. So with that said lets look at some more options when it comes to finding out if a Value is NaN.
3 - The Number.isNaN method
So the Number.isNaN method works as expected if what is expected is for the method to return true only if the given value is NaN and only NaN.
The only problem with Number.isNaN is that it does not work on any version of IE, there is no support at all. So then this might be a reason why you might want to use some kind of user space option for testing for NaN if you care about supporting those older platforms for some reason. With that said lets look at making a user space option as that is nit so hard to do when it comes to working out a quick user space solution.
4 - Writing an isNaN method
When going vanilla js style with a project, a method that tests for NaN might need to be part of a custom micro frame work, or utilities library of sorts. Making a method to do this is not so hard, one way is to just return false if any type other than a Number is given, then convert to a String and test against the String ‘NaN’. In the off chance that the string ‘NaN’ is given then it will return false because the type is is a String, and thus will not get to the part where we are converting the string value to a string. So in this section I will be going over some user space examples of testing for NaN, that mainly take this kind of approach.
4.1 - The example from the basic section
In the basic section I covered this user space example right here.
4.2 - Crunching it down a little
One step forward might be doing something to not need to additional second if statement.
This seems to behave like that of Number.isNaN, but will work on old browsers. It seems to work okay, but maybe you might prefer to use the method that exists in lodash that makes use of the fact that NaN is the only primitive value that does not equal itself. Also there is the idea of just using whatever it is that they are using in lodash as a single stand alone method, or in one way or another find out a simple single expression type solution for this.
4.3 - slick one line example
So of course this is a Nice slick one liner. On top of that this kind of method makes use of the Nature of NaN not equaling itself. However the check for the number type still needs to be preformed because the string value of ‘NaN’ will still return true.
4.4 - Monkey patching Number.isNaN
Monkey Patching is generally frowned upon, but generally only if you are extending built in Objects with non standard methods. In this case monkey patching Number.isNaN support is just making sure that something that should be there is there.
6 - Conclusion
Sooner or later I will be getting around to editing and expanding this post a bit more, however I think there is only so much more to cover. I think that in the future the only thing left to do would be to just write a bit more about various code examples that typicality result in NaN values, and additional ways to not just test for NaN but also to prevent it from happening to begin with.