NaN isimli bir sabite sahiptir. Ancak bu sabit kendisi de dahil hiç bir şey ile eşit veya denk değildir. Bu değeri herhangi bir şey ile karşılaştırmadan bir mantıksal sınama yordamına sokarsanız JavaScript otomatik olarak bunu gördüğü yere false koyup yoluna devam edecektir. Tek işe yarar bir şey sağladığı durum budur.
if<bkz type="short" space=""> ! parseInt( 'abc', 10 </bkz>)
// sayı girilmediği için NaN değer döner
// False olarak ele alınır, ! ile bunun tersi true elde edilir if match olur aşağıdaki satır çalışır
console.log<bkz type="short" space="">'not a number'</bkz>
Buradaki mantık aslında basittir. NaN, not a number ifadesinin kısa yazılmış halidir. Yani kümesel düşünürsek sayılar hariç diğer her şeyi kapsayan geniş bir tür havuzunu temsil eder. Yani NaN bir function da olabilir, bir string de olabilir. Bunların hepsi olabileceği için sadece string de diyemeyiz sadece array de diyemeyiz çünkü hepsidir ama tek tek hiç biridir.
Burada haklı olarak neden kendisine eşit olmadığını sorabilirsiniz. Kendisine de eşit değildir çünkü kendisi de bir türdür ve tek tek türlerle eşleşmez demiştik zaten. Bunun yerine NaN spesifik bir türü değil bir türler kümesini temsil ettiği için kendisiyle eşleşmez de diyebiliriz. Her iki türlü de kendisiyle eşleşmemesini mantıklı biçimde açıklamak mümkün.
JSON.Stringify bunu gördüğünde null olarak dönüştürür.
ek notlar
Bu sabitin freeze edilmiş (property eklenemez) bir
proto alanı var. Bu alanda da Number türünün prototype'ında bulunan tüm metodlar (toExponential, toFixed ve diğerleri) bulunuyor. Kısaca NaN sabitini oluştururken Number türünün prototype'ını kullanmışlar. Dolayısıyla aslında NaN bir şeye
not a number derken bile bunu da Number türü gibi davranarak söylüyor.