La funzione isNaN integrata di JavaScript è, come dovrebbe essere previsto per impostazione predefinita, un "operatore di tipo dinamico". Pertanto tutti i valori che (durante il processo DTC) possono produrre un semplice vero | falso come"", " ", " 000"
, non può essere NaN.
Ciò significa che l' argomento fornito verrà prima sottoposto a una conversione come in:
function isNaNDemo(arg){
var x = new Number(arg).valueOf();
return x != x;
}
Spiegazione:
Nella riga superiore del corpo della funzione, stiamo (innanzitutto) cercando di convertire correttamente l'argomento in un oggetto numerico. E (secondo), usando l'operatore punto siamo - per nostra comodità - a rimuovere immediatamente, il valore primitivo dell'oggetto creato.
Nella seconda riga, stiamo prendendo il valore ottenuto nel passaggio precedente e il vantaggio del fatto che NaN non è uguale a nulla nell'universo, nemmeno a se stesso, ad esempio:NaN == NaN >> false
per confrontarlo finalmente (per disuguaglianza) con se stesso .
In questo modo la funzione return restituirà true solo quando, e solo se, l'argomento return-return fornito è un tentativo fallito di conversione in un oggetto numerico, cioè un numero non numerico; ad es. NaN.
isNaNstatic ()
Tuttavia, per un operatore di tipo statico - se necessario e quando necessario - possiamo scrivere una funzione molto più semplice come:
function isNaNstatic(x){
return x != x;
}
Ed evita del tutto il DTC in modo che se l'argomento non è esplicitamente un numero NaN, restituirà false. Pertanto, test per quanto segue:
isNaNStatic(" x"); // will return false
perché è ancora una stringa.
Tuttavia:
isNaNStatic(1/"x"); // will of course return true.
come ad esempio isNaNStatic(NaN); >> true
.
Ma al contrario isNaN
, il isNaNStatic("NaN"); >> false
perché esso (l'argomento) è una stringa ordinaria.
ps: la versione statica di isNaN può essere molto utile nei moderni scenari di codifica. E potrebbe benissimo essere uno dei motivi principali per cui mi sono preso il tempo per pubblicarlo.
Saluti.