ESLint Nieoczekiwane użycie isNaN

154

Próbuję użyć isNaNfunkcji globalnej wewnątrz funkcji strzałki w module Node.js, ale pojawia się ten błąd:

[eslint] Unexpected use of 'isNaN'. (no-restricted-globals)

To jest mój kod:

const isNumber = value => !isNaN(parseFloat(value));

module.exports = {
  isNumber,
};

Masz jakiś pomysł, co robię źle?

PS: Używam przewodnika stylistycznego AirBnB.

Elias Garcia
źródło

Odpowiedzi:

282

Jak sugeruje dokumentacja , użyj Number.isNaN.

const isNumber = value => !Number.isNaN(Number(value));

Cytując dokumentację Airbnb:

Czemu? Globalny isNaN zamienia nieliczby na liczby, zwracając prawdę dla wszystkiego, co wymusza na NaN. Jeśli takie zachowanie jest pożądane, wyraź to.

// bad
isNaN('1.2'); // false
isNaN('1.2.3'); // true

// good
Number.isNaN('1.2.3'); // false
Number.isNaN(Number('1.2.3')); // true
Andy Gaskell
źródło
28
Ale isNaNi Number.isNaNto nie są te same funkcje. Na przykład isNaN('1a') true Number.isNaN('1a') false
rosencreuz
3
@rosencreuz Bardziej jak niepożądane zachowanie. Dlatego jest Number('1.2.3')w powyższym przykładzie.
Patrick Portal
2
Cóż za głupia zasada, chodzi o to, żeby wymusić na jakiejś liczbie, albo równie dobrze możesz po prostu typeofsprawdzić.
Dominic
Używam, Number.isNaN(+'1.2.3')co jest tylko dodatkiem, +jeśli używaszNumber.isNaN
Ibraheem
16

FYI, to nie zadziała w IE. Sprawdź tutaj zgodność przeglądarek.

tyforhtian
źródło
3

@Andy Gaskell isNumber('1.2.3')powróć true, możesz edytować swoją odpowiedź i użyć Number()zamiastparseFloat()

    const isEmpty = value => typeof value === 'undefined' || value === null || value === false;
    const isNumeric = value => !isEmpty(value) && !Number.isNaN(Number(value));
  console.log(isNumeric('5')); // true
  console.log(isNumeric('-5')); // true
  console.log(isNumeric('5.5')); // true
  console.log(isNumeric('5.5.5')); // false
  console.log(isNumeric(null)); // false
  console.log(isNumeric(undefined)); // false
Vincent Baronnet
źródło
Właśnie zauważyłem tę odpowiedź teraz. Moja odpowiedź została zaktualizowana, dziękuję!
Andy Gaskell
1

W moim przypadku chciałem traktować 5 (liczbę całkowitą), 5,4 (dziesiętną), „5”, „5,4” jako liczby, ale na przykład nic więcej.

Jeśli masz podobne wymagania, poniższe mogą działać lepiej:

const isNum = num => /^\d+$/.test(num) || /^\d+\.\d+$/.test(num);

//Check your variable if it is a number.
let myNum = 5;
console.log(isNum(myNum))

Aby uwzględnić liczby ujemne:

const isNum = num => /^-?\d+$/.test(num) || /^-?\d+\.\d+$/.test(num);

Spowoduje to również usunięcie problemu z globalnym używaniem isNaN. Jeśli przekonwertujesz funkcję isNum na normalną funkcję ES5, będzie ona działać również w przeglądarce IE.

Noby Fujioka
źródło
0

Dla mnie to działało dobrze i nie miałem żadnego problemu z ESlint

window.isNaN()

Yoannes Geissler
źródło
Korzystając ze standardu AirBnb powinieneś otrzymać: ESLint: 'window.isNaN' jest zabronione. Zamiast tego użyj Number.isNaN (no-limited-properties)
Bartek Maciejewski
@BartekMaciejewski Problem z Number.isNaN polega na tym, że nie są to te same funkcje. Na przykład. Number.isNaN('abc')jest false. I isNaN('abc')jesttrue
Yoannes Geissler
Tak, całkowicie się z tobą zgadzam - chciałem tylko wspomnieć, że używanie window.isNan()jest sprzeczne z inną konfiguracją AirBnb (reguła to eslint.org/docs/rules/no-restricted-properties )
Bartek Maciejewski
@BartekMaciejewski To uciążliwe, niestety musiałem dezaktywować z no-restricted-propertiespowodu tego problemu
Yoannes Geissler