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

155

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

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

Это мой код:

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

module.exports = {
  isNumber,
};

Есть идеи, что я делаю не так?

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

Элиас Гарсия
источник

Ответы:

283

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

const isNumber = value => !Number.isNaN(Number(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
Энди Гаскелл
источник
28
Но isNaNи Number.isNaNэто не те же функции. Например isNaN('1a') true Number.isNaN('1a') false
rosencreuz
3
@rosencreuz Больше похоже на нежелательное поведение. Вот почему есть Number('1.2.3')в примере выше.
Патрик Портал
2
Какое глупое правило, весь смысл в том, чтобы привести к числу, или вы могли бы просто сделать typeofпроверку.
Доминик
Я использую Number.isNaN(+'1.2.3')что является дополнительным, +если вы используетеNumber.isNaN
Ибрагим
16

К вашему сведению, это не будет работать для IE. Проверьте здесь на совместимость браузера.

thyforhtian
источник
3

@ Энди Гаскелл 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
Винсент Бароннет
источник
Я только что заметил этот ответ сейчас. Мой ответ был обновлен, спасибо!
Энди Гаскелл
1

В моем случае я хотел рассматривать 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.

Ноби Фудзиока
источник
0

Для меня это работало нормально и не было никаких проблем с ESlint

window.isNaN()

Йоанн Гайслер
источник
Используя стандарт AirBnb, вы должны получить: ESLint: 'window.isNaN' запрещено использовать. Пожалуйста, используйте Number.isNaN вместо (без ограничений-свойств)
Bartek Maciejewski
@BartekMaciejewski Проблема с Number.isNaN заключается в том, что они не являются одинаковыми функциями. Например. Number.isNaN('abc')есть false. И isNaN('abc')этоtrue
Йоанн Гайслер
Да, я полностью согласен с вами - просто хотел упомянуть, что использование window.isNan()против другого конфига AirBnb (правило eslint.org/docs/rules/no-restricted-properties )
Maciejewski
@BartekMaciejewski Это боль, мне, к сожалению, пришлось деактивировать no-restricted-propertiesиз-за этой проблемы
Йоанн Гайслер