ESLint Unerwartete Verwendung von isNaN

154

Ich versuche, die isNaNglobale Funktion innerhalb einer Pfeilfunktion in einem Node.js-Modul zu verwenden, erhalte jedoch den folgenden Fehler:

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

Das ist mein Code:

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

module.exports = {
  isNumber,
};

Irgendeine Idee, was ich falsch mache?

PS: Ich verwende den AirBnB-Styleguide.

Elias Garcia
quelle

Antworten:

281

Verwenden Sie, wie in der Dokumentation angegebenNumber.isNaN .

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

Zitieren der Airbnb-Dokumentation:

Warum? Das globale isNaN erzwingt Nicht-Zahlen zu Zahlen und gibt für alles, was zu NaN erzwingt, true zurück. Wenn dieses Verhalten gewünscht wird, machen Sie es explizit.

// 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
quelle
28
Aber isNaNund Number.isNaNsind nicht die gleichen Funktionen. Zum Beispiel isNaN('1a') true Number.isNaN('1a') false
Rosencreuz
3
@rosencreuz Eher wie unerwünschtes Verhalten. Deshalb gibt es Number('1.2.3')im obigen Beispiel.
Patrick Portal
2
Was für eine dumme Regel, der springende Punkt ist, zu einer Zahl zu zwingen, oder Sie könnten genauso gut einfach einen typeofScheck machen.
Dominic
Ich benutze, Number.isNaN(+'1.2.3')was nur ein Extra ist, +wenn Sie verwendenNumber.isNaN
Ibraheem
16

Zu Ihrer Information, dies wird nicht für IE funktionieren. Überprüfen Sie hier die Browserkompatibilität.

Thyforhtian
quelle
3

@Andy Gaskell isNumber('1.2.3')zurück true, vielleicht möchten Sie Ihre Antwort bearbeiten und Number()anstelle von verwendenparseFloat()

    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
quelle
Ich habe diese Antwort gerade bemerkt. Meine Antwort wurde aktualisiert, danke!
Andy Gaskell
1

In meinem Fall wollte ich 5 (Ganzzahl), 5,4 (Dezimal), '5', '5,4' als Zahlen behandeln, aber zum Beispiel nichts anderes.

Wenn Sie ähnliche Anforderungen haben, funktioniert das Folgende möglicherweise besser:

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))

Um negative Zahlen einzuschließen:

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

Dadurch wird auch Ihr Problem der globalen Nutzung von isNaN behoben. Wenn Sie die isNum-Funktion in eine normale ES5-Funktion konvertieren, funktioniert sie auch im IE-Browser.

Edler Fujioka
quelle
0

Für mich hat das gut funktioniert und ich hatte kein Problem mit ESlint

window.isNaN()

Yoannes Geissler
quelle
Wenn Sie den AirBnb-Standard verwenden, sollten Sie Folgendes erhalten: ESLint: 'window.isNaN' darf nicht verwendet werden. Bitte verwenden Sie stattdessen Number.isNaN (keine eingeschränkten Eigenschaften)
Bartek Maciejewski
@BartekMaciejewski Das Problem mit Number.isNaN ist, dass es sich nicht um dieselben Funktionen handelt. Beispielsweise. Number.isNaN('abc')ist false. Und isNaN('abc')isttrue
Yoannes Geissler
Ja, ich stimme Ihnen voll und ganz zu - ich wollte nur erwähnen, dass die Verwendung window.isNan()gegen die Konfiguration anderer AirBnb verstößt (die Regel lautet eslint.org/docs/rules/no-restricted-properties )
Bartek Maciejewski,
@BartekMaciejewski Dies ist ein Schmerz, den ich leider no-restricted-propertieswegen dieses Problems deaktivieren musste
Yoannes Geissler