Rozdíl mezi isNaN a Number.isNaN
Téměř každý ví, co je `isNaN` a jak jej používat. Znamená to „je ta věc, která vypadá jako číslo, opravdu číslo nebo ne?“ Vrátí true, pokud je zadáno „Not a Number“. Předpokládám, že jste to pochopili. Dobře, tady je dohoda; jaký je rozdíl mezi isNaN a Number.isNaN?
Než začnu vysvětlovat, chci poděkovat svému příteli Rafaelovi za to, že mě povzbudil k psaní.
Začněme isNaN. Toto je globální funkce, ze které můžete volat odkudkoli. Podívejme se na to v akci:
const badDivision = 17 / "something"; // NaN
isNaN(badDivision); // true
Je to tak jednoduché, ale existují určité nesprávné směry. Zde jsou příklady:
Jak vidíte podle implementace isNaN, zachází s řetězcovou hodnotou jako s číslem a na základě toho vrátí výsledek. Zaškrtněte `isNaN (‚blabla‘)`
Takže abychom vyřešili tyto mylné představy, máme Statická metoda Number.isNaN je dodávána s EcmaScript 2015 # Number.isNaN
Co dělá?
V mém případě mám metodu, která přijímá dva parametry jako typ čísla a dělá nějakou animaci při změně měřítka cíle objekt. Nějak jsem po provedení malého refaktoringu dostal divné chování. Ano, měl bych mít písemné testy na jednotku, škoda mě. V každém případě metoda v některých případech přijímá nedefinované jako parametry. Musím je tedy zkontrolovat.
Napsal jsem toto:
Moje neopatrnost mě vede ke špatné logice. Protože Number.isNaN (undefined) mi vrátí hodnotu false. (old isNaN (undefined) returns true) Tak jsem se změnil takto:
function animate(targetScaleX, targetScaleY) {
if (!Number.isNaN(targetScaleX * targetScaleY)) {
return;
} // Do Animation
}
Zdá se tedy, že to funguje. Ale chtěl jsem se starat o každé možné selhání. Možná bych mohl obdržet null místo nedefinovaných. Pokud dostanu null, moje logika selže. Proč?
null * null; // 0
null * 8 // 0
Myslím, že tu věc vidíte. Aktualizoval jsem tedy kód takto:
Mým cílem byla kontrola dvou hodnot, aby byly nedefinované nebo nulové. A moje cesta skončí napsáním tohoto článku a aktualizací mých znalostí. Implementace není fantastická, vím, ale cesta byla poučná.