JavaScript wbudowanej isNaN funkcji, jest - jak należy oczekiwać domyślnie - „Dynamiczny Type Operator”. Dlatego wszystkie wartości, które (podczas procesu DTC) mogą dawać prostą prawdę | fałszywe, takie jak"", " ", " 000" , nie może być NaN.
Oznacza to, że podany argument zostanie najpierw poddany konwersji, jak w:
function isNaNDemo(arg){
var x = new Number(arg).valueOf();
return x != x;
}
Wyjaśnienie:
W górnym wierszu treści funkcji (najpierw) próbujemy pomyślnie przekształcić argument na obiekt liczbowy. I (drugi), za pomocą operatora kropki jesteśmy - dla własnej wygody - natychmiast zdzierając, prymitywny wartość tworzonego obiektu.
W drugim wierszu bierzemy wartość uzyskaną w poprzednim kroku oraz zaletę faktu, że NaN nie jest równe żadnemu we wszechświecie, nawet sobie, np:NaN == NaN >> false aby ostatecznie porównać ją (pod kątem nierówności) ze sobą .
W ten sposób funkcja return zwróci wartość true tylko wtedy i tylko wtedy, gdy podany argument-return jest nieudaną próbą konwersji na obiekt liczbowy, tj. Liczbę niebędącą liczbą; np. NaN.
isNaNstatic ()
Jednak dla operatora typu statycznego - w razie potrzeby i kiedy potrzeba - możemy napisać znacznie prostszą funkcję, taką jak:
function isNaNstatic(x){
return x != x;
}
I całkowicie unikaj DTC, aby jeśli argument nie był jawnie liczbą NaN, zwrócił fałsz. Dlatego testowanie pod kątem:
isNaNStatic(" x"); // will return false ponieważ nadal jest to ciąg.
Jednak:
isNaNStatic(1/"x"); // will of course return true.tak jak na przykładisNaNStatic(NaN); >> true .
Ale w przeciwieństwie do tego isNaN, isNaNStatic("NaN"); >> falseponieważ to (argument) jest zwykłym ciągiem.
ps: Statyczna wersja isNaN może być bardzo przydatna w nowoczesnych scenariuszach kodowania. I może to być jeden z głównych powodów, dla których nie spieszyłem się z opublikowaniem tego.
Pozdrowienia.