NaN is a dangerous beast. NaN is a special value that means “not a number”, but in fact it is a number you can calculate with.
NaN is contagious. All calculations involving NaN fail silently, yielding NaN:
5 + NaNmakes NaN,
Math.sqrt(NaN)produces NaN. All comparisons with NaN yield false:
5 > NaNis false,
5 < NaNis also false.
5 === NaNis false,
NaN === NaNis also false.
If a NaN slips into your logic, it is carried through the rest of the program until the user sees a “NaN” appearing in the interface. It is hard to find the cause of a NaN since the place where it appears can be far from the place that caused it. Typically, the cause of a NaN is an implicit type conversion. My advice is to raise the alarm as soon as you see a NaN.