ESLint Uso inesperado de isNaN

154

Estoy tratando de usar la isNaNfunción global dentro de una función de flecha en un módulo Node.js pero recibo este error:

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

Este es mi código:

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

module.exports = {
  isNumber,
};

¿Alguna idea de lo que estoy haciendo mal?

PD: estoy usando la guía de estilo AirBnB.

Elias Garcia
fuente

Respuestas:

282

Como sugiere la documentación , use Number.isNaN.

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

Citando la documentación de Airbnb:

¿Por qué? El isNaN global coacciona los no números a números, devolviéndose verdadero para todo lo que coacciona a NaN. Si se desea este comportamiento, explíquelo.

// 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
fuente
28
Pero isNaNy Number.isNaNno son las mismas funciones. Por ejemplo isNaN('1a') true Number.isNaN('1a') false
rosencreuz
3
@rosencreuz Más como un comportamiento no deseado. Es por eso que hay Number('1.2.3')en el ejemplo anterior.
Patrick Portal
2
Qué regla tan estúpida, el punto es coaccionar a un número o bien, simplemente podrías hacer una typeofcomprobación.
Dominic
Yo uso lo Number.isNaN(+'1.2.3')que es solo un extra +si lo usasNumber.isNaN
Ibraheem
16

FYI, esto no funcionará para IE. Verifique aquí la compatibilidad del navegador.

thyforhtian
fuente
3

@Andy Gaskell isNumber('1.2.3')regresa true, es posible que desee editar su respuesta y usarla Number()en lugar deparseFloat()

    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
fuente
Acabo de notar esta respuesta ahora. Mi respuesta ha sido actualizada, gracias!
Andy Gaskell
1

En mi caso, quería tratar 5 (entero), 5.4 (decimal), '5', '5.4' como números, pero nada más, por ejemplo.

Si tiene los requisitos similares, a continuación puede funcionar mejor:

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

Para incluir números negativos:

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

Esto eliminará su problema de uso global de isNaN también. Si convierte la función isNum en una función ES5 normal, también funcionará en el navegador IE.

Noby Fujioka
fuente
0

Para mí, esto funcionó bien y no tuve ningún problema con ESlint

window.isNaN()

Yoannes Geissler
fuente
Usando el estándar AirBnb debería obtener: ESLint: 'window.isNaN' está restringido de ser utilizado. Utilice Number.isNaN en su lugar (propiedades no restringidas)
Bartek Maciejewski
@BartekMaciejewski El problema con Number.isNaN es que no son las mismas funciones. Por ejemplo. Number.isNaN('abc')es false. Y isNaN('abc')estrue
Yoannes Geissler
Sí, estoy totalmente de acuerdo con usted, solo quería mencionar que el uso window.isNan()está en contra de la configuración de otros AirBnb (la regla es eslint.org/docs/rules/no-restricted-properties )
Bartek Maciejewski
@BartekMaciejewski Esto es un dolor, desafortunadamente tuve que desactivarlo no-restricted-propertiesdebido a este problema
Yoannes Geissler