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.

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

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


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

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.


0

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

window.isNaN()


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.