ESLint Uso imprevisto di isNaN


155

Sto cercando di utilizzare la isNaNfunzione globale all'interno di una funzione freccia in un modulo Node.js ma sto riscontrando questo errore:

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

Questo è il mio codice:

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

module.exports = {
  isNumber,
};

Qualche idea su cosa sto facendo di sbagliato?

PS: sto usando la guida di stile AirBnB.

Risposte:


283

Come suggerisce la documentazione , utilizzare Number.isNaN.

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

Citando la documentazione di Airbnb:

Perché? L'isNaN globale costringe i non numeri ai numeri, restituendo vero per tutto ciò che costringe a NaN. Se si desidera questo comportamento, renderlo esplicito.

// 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
Ma isNaNe Number.isNaNnon sono le stesse funzioni. Ad esempio isNaN('1a') true Number.isNaN('1a') false
rosencreuz,

3
@rosencreuz Più come comportamenti indesiderati. Ecco perché c'è Number('1.2.3')nell'esempio sopra.
Patrick Portal,

2
Che stupida regola, il punto è costringere a un numero o potresti anche fare un typeofcontrollo.
Dominic

Uso quello Number.isNaN(+'1.2.3')che è solo un extra +se usiNumber.isNaN
Ibraheem,

16

Cordiali saluti, questo non funzionerà per IE. Controlla qui alla compatibilità del browser.


3

@Andy Gaskell isNumber('1.2.3')torna true, potresti voler modificare la tua risposta e usarla Number()al posto diparseFloat()

    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

Ho appena notato questa risposta ora. La mia risposta è stata aggiornata, grazie!
Andy Gaskell, il

1

Nel mio caso, volevo trattare 5 (numero intero), 5.4 (decimale), '5', '5.4' come numeri ma nient'altro per esempio.

Se hai requisiti simili, di seguito potrebbe funzionare meglio:

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

Per includere numeri negativi:

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

Ciò eliminerà anche il problema dell'uso globale di isNaN. Se converti la funzione isNum in una normale funzione ES5, funzionerà anche sul browser IE.


0

Per me questo ha funzionato bene e non ha avuto problemi con ESlint

window.isNaN()


Utilizzando lo standard AirBnb dovresti ottenere: ESLint: 'window.isNaN' non può essere utilizzato. Si prega di usare Number.isNaN invece (senza proprietà limitate)
Bartek Maciejewski

@BartekMaciejewski Il problema con Number.isNaN è che non hanno le stesse funzioni. Per esempio. Number.isNaN('abc')lo è false. Ed isNaN('abc')ètrue
Yoannes Geissler il

Sì, sono totalmente d'accordo con te - volevo solo menzionare che l'utilizzo window.isNan()è contrario alla configurazione di altri AirBnb (la regola è eslint.org/docs/rules/no-restricted-properties )
Bartek Maciejewski

@BartekMaciejewski Questo è un dolore, purtroppo ho dovuto disattivare il no-restricted-propertiescausa di questo problema
Yoannes Geissler
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.