V minulosti som sa podobnej problematike už venoval, no opätovne sa k nej vraciam. Tentokrát budem demonštrovať použitie isNaN() a NaN v praxi.
K tomuto článku ma viedlo vytvorenie funkcie isNumber()
, ktorá je trochu šalamúnska. Nestačí iba zistiť, či hodnota je typu číslo, ale treba ešte skontrolovať či hodnota je naozaj číslo. No a tu sa to trochu začína zamotávať. Ak by sme opäť išli iba smerom, že ideme zistiť či hodnota je číslo a nie typu číslo, opäť by sme dospeli k nesprávnemu riešeniu. Všetko potrebné pochopíte na nasledujúcich príkladoch a výsledkoch, ktoré sú uvedené v komentároch.
Prvým príkladom je funkcia na detegovanie hodnoty. Konkrétne, či hodnota je číslo. A tu prichádza k prvému problému. Natívna funkcia isNaN()
totiž spracuje hodnotu aj ak číslo je ako string.
console.log(isNaN(10)); // false
console.log(isNaN("10a")); // true
console.log(isNaN("40")); // false
console.log(isNaN(40)); // false
console.log(isNaN("")); // false
Kvôli tejto skutočnosti je potrebné pri detegovaní čísla vykonať dve kontroly a to kontrolu typu a kontrolu hodnoty, či hodnota je číslo.
function isNumber(value) {
if (typeof value === "number" && !isNaN(value)) {
return true;
} else {
return false;
}
}
console.log(isNumber(10)); // true
console.log(isNumber("10a")); // false
console.log(isNumber("1s40a")); // false
console.log(isNumber("40")); // false
console.log(isNumber(40)); // true
console.log(isNumber("")); // false
A teraz sa dostávame konečne k reálnemu použitiu hodnoty NaN
.
function updateValue(value) {
if (isNaN(value)) {
return NaN;
}
return value;
}
console.log(updateValue(10)); // 10
console.log(updateValue("10")); // 10
console.log(updateValue("10a")); // NaN
A na záver ďalšia špecialitka JavaScriptu. Aj toto má za následok, prečo samotnú funkciu isNaN()
nie je možné použiť na zisťovanie, či je hodnota číslo alebo nie.
console.log("" == 0); // true
Záver
O špecialitách JavaScriptu som už napísal článok a spravil aj video. Možno sa k tejto téme ešte niekedy vrátim aj na tomto portáli.