Różnica między isNaN i Number.isNaN
Prawie każdy wie, czym jest „isNaN” i jak go używać. To znaczy „czy to, co wygląda jak liczba, naprawdę jest liczbą, czy nie?” Zwraca prawdę, jeśli podano „Nie jest liczbą”. Zakładam, że masz rację. Ok, teraz sprawa; jaka jest różnica między isNaN i Number.isNaN?
Zanim zacznę wyjaśniać, chcę podziękować mojemu przyjacielowi Rafaelowi za zachęcenie mnie do pisania.
Zacznijmy od isNaN. Jest to globalna funkcja, którą możesz wywołać z dowolnego miejsca. Zobaczmy, jak to działa:
const badDivision = 17 / "something"; // NaN
isNaN(badDivision); // true
To takie proste, ale jest kilka błędnych wskazówek. Oto przykłady:
Jak widać zgodnie z implementacją isNaN traktuje wartość ciągu jako liczbę i zwraca wynik na tej podstawie. Sprawdź `isNaN (’blabla')`
Aby rozwiązać te nieporozumienia, które mamy Metoda statyczna Number.isNaN jest dostarczana z EcmaScript 2015 # Number.isNaN
Co to robi?
W moim przypadku mam metodę, która akceptuje dwa parametry jako typ liczbowy i wykonuję animację skalowania celu obiekt. W jakiś sposób po drobnych refaktoryzacjach zachowywałem się dziwnie. Tak, powinienem był napisać testy jednostkowe, wstyd mi. W każdym razie w niektórych przypadkach metoda otrzymuje nieokreślone parametry. Muszę więc je sprawdzić.
Napisałem to:
Moja nieostrożność prowadzi mnie do złej logiki. Ponieważ Number.isNaN (undefined) zwróci mi fałsz. (stary isNaN (undefined) zwraca true) Więc zmieniłem to w ten sposób:
function animate(targetScaleX, targetScaleY) {
if (!Number.isNaN(targetScaleX * targetScaleY)) {
return;
} // Do Animation
}
Wygląda na to, że działa. Ale chciałem zająć się każdą możliwą porażką. Może otrzymam wartość null zamiast undefined. Jeśli otrzymam wartość null, moja logika zawiedzie. Dlaczego?
null * null; // 0
null * 8 // 0
Myślę, że to widzisz. Więc zaktualizowałem kod w ten sposób:
Moim celem było sprawdzenie dwóch wartości, aby były niezdefiniowane lub zerowe. Moja podróż kończy się napisaniem tego artykułu i aktualizacją mojej wiedzy. Wdrożenie nie jest wyszukane, wiem, ale podróż była edukacyjna.