ESLint Неожиданное использование isNaN

Я пытаюсь использовать глобальную функцию isNaN внутри функции стрелки в модуле Node.js, но я получаю эту ошибку:

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

Это мой код:

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

module.exports = {
  isNumber,
};

Любая идея о том, что я делаю неправильно?

PS: Я использую руководство по стилю AirBnB.

Ответы

Ответ 1

Как предлагает документация, используйте Number.isNaN.

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

Котировка документации Airbnb:

Зачем? Глобальный isNaN принуждает номера не числа к номерам, возвращая true для чего-либо, что принуждает к NaN. Если это поведение желательно, сделайте его явным.

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

// good
Number.isNaN('1.2.3'); // false
Number.isNaN(Number('1.2.3')); // true

Ответ 2

FYI, это не будет работать для IE. Проверьте здесь, в браузере.

Ответ 3

В моем случае я хотел трактовать 5 (целое число), 5,4 (десятичное число), "5", "5,4" как числа, но больше ничего, например.

Если у вас есть аналогичные требования, ниже может работать лучше:

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

Чтобы включить отрицательные числа:

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

Это также устранит проблему глобального использования isNaN. Если вы преобразуете функцию isNum в обычную функцию ES5, она будет работать и в браузере IE.

Ответ 4

@Энди Гаскелл isNumber('1.2.3') вернет true, вы можете отредактировать свой ответ и использовать Number() вместо parseFloat()

    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