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"); >> false
ponieważ 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.