ESLint Penggunaan isNaN yang tidak terduga

154

Saya mencoba menggunakan isNaNfungsi global di dalam fungsi panah di modul Node.js tapi saya mendapatkan kesalahan ini:

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

Ini kode saya:

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

module.exports = {
  isNumber,
};

Adakah yang tahu kesalahan saya?

PS: Saya menggunakan panduan gaya AirBnB.

Elias Garcia
sumber

Jawaban:

282

Seperti yang disarankan dalam dokumentasi , gunakan Number.isNaN.

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

Mengutip dokumentasi Airbnb:

Mengapa? IsNaN global memaksa non-angka ke angka, mengembalikan true untuk apa pun yang memaksa ke NaN. Jika perilaku ini diinginkan, buat eksplisit.

// 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
sumber
28
Tapi isNaNdan Number.isNaNbukan fungsi yang sama. Misalnya isNaN('1a') true Number.isNaN('1a') false
rosencreuz
3
@rosencreuz Lebih menyukai perilaku yang tidak diinginkan. Itu sebabnya ada Number('1.2.3')pada contoh di atas.
Patrick Portal
2
Apa aturan bodoh, intinya adalah memaksa untuk nomor atau Anda mungkin hanya melakukan typeofcek.
Dominic
Saya menggunakan Number.isNaN(+'1.2.3')yang hanya tambahan +jika Anda menggunakanNumber.isNaN
Ibraheem
16

FYI, ini tidak akan berfungsi untuk IE. Periksa di sini di kompatibilitas browser.

thyforhtian
sumber
3

@Andy Gaskell isNumber('1.2.3')kembali true, Anda mungkin ingin mengedit jawaban dan menggunakannya Number()sebagai gantiparseFloat()

    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
sumber
Saya hanya memperhatikan jawaban ini sekarang. Jawaban saya sudah diperbarui, terima kasih!
Andy Gaskell
1

Dalam kasus saya, saya ingin memperlakukan 5 (bilangan bulat), 5,4 (desimal), '5', '5,4' sebagai angka tetapi tidak ada yang lain misalnya.

Jika Anda memiliki persyaratan serupa, di bawah ini mungkin berfungsi lebih baik:

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

Untuk memasukkan angka negatif:

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

Ini akan menghapus masalah Anda tentang penggunaan global isNaN juga. Jika Anda mengonversi fungsi isNum ke fungsi ES5 normal, itu juga akan berfungsi pada browser IE.

Noby Fujioka
sumber
0

Bagi saya ini berfungsi dengan baik dan tidak memiliki masalah dengan ESlint

window.isNaN()

Yoannes Geissler
sumber
Menggunakan standar AirBnb Anda harus mendapatkan: ESLint: 'window.isNaN' dilarang digunakan. Silakan gunakan Number.isNaN sebagai gantinya (tanpa-properti-terbatas)
Bartek Maciejewski
@ BartekMaciejewski Masalah dengan Number.isNaN adalah mereka tidak memiliki fungsi yang sama. Sebagai contoh. Number.isNaN('abc')adalah false. Dan isNaN('abc')adalahtrue
Yoannes Geissler
Ya, saya sepenuhnya setuju dengan Anda - hanya ingin menyebutkan bahwa penggunaan window.isNan()bertentangan dengan konfigurasi AirBnb lainnya (aturannya adalah eslint.org/docs/rules/no-restricted-properties )
Bartek Maciejewski
@ BartartMaciejewski Ini menyakitkan, sayangnya saya harus menonaktifkan no-restricted-propertieskarena masalah ini
Yoannes Geissler