ESLint Несподіване використання isNaN


154

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

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

Це мій код:

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

module.exports = {
  isNumber,
};

Будь-яка ідея про те, що я роблю неправильно?

PS: Я використовую посібник зі стилю AirBnB.

Відповіді:


282

Як підказує документація , використовуйте Number.isNaN.

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

Цитуючи документацію Airbnb:

Чому? Глобальний isNaN примушує не числа до чисел, повертаючи істину для всього, що примушує до 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
Ібрагеем


3

@Andy Gaskell 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 )
Bartek Maciejewski,

@BartekMaciejewski Це біль, мені, на жаль, довелося деактивувати no-restricted-propertiesчерез цю проблему
Yoannes Geissler
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.