JSLint mengatakan "parameter radix hilang"

538

Saya menjalankan JSLint pada kode JavaScript ini dan mengatakan:

Masalah pada baris 32 karakter 30: Parameter radix tidak ada.

Ini adalah kode yang dimaksud:

imageIndex = parseInt(id.substring(id.length - 1))-1;

Apa yang salah di sini?

Mike Vierwind
sumber

Jawaban:

967

Itu selalu praktik yang baik untuk lulus radix dengan parseInt -

parseInt(string, radix)

Untuk desimal -

parseInt(id.substring(id.length - 1), 10)

Jika parameter radix dihilangkan, JavaScript mengasumsikan yang berikut:

  • Jika string dimulai dengan "0x", radix adalah 16 (heksadesimal)
  • Jika string dimulai dengan "0", radix adalah 8 (oktal). Fitur ini sudah usang
  • Jika string dimulai dengan nilai lain, radix adalah 10 (desimal)

( Referensi )

Jayendra
sumber
7
Dari bunyi-bunyinya, standarnya adalah 10. Jika tidak dimulai dengan 0x atau 0, standarnya adalah radix 10. Tapi itu adalah praktik terbaik untuk menentukan radix bahkan jika itu adalah nilai default, semacam seperti menentukan definisi "ini" ke fungsi array.map.
molson504x
81
itu sangat tidak masuk akal ... dengan logika itu harus ada param ketiga untuk mewakili radix dari argumen radix itu sendiri
Nishant
6
Setuju dengan komentator lain. Mengapa bagus untuk memberikan nilai radix ketika standarnya adalah 10? Ini menentang konvensi umum.
Richard Clayton
9
Tambahkan 10 sebagai radix untuk mendapatkan kesalahan serat lagi ...Redundant radix parameter
Shanimal
2
@Nishant: radixArgumen adalah nilai numerik, bukan representasi string dari nilai numerik, jadi tidak ada radix untuk ditentukan.
tokland
79

Untuk menghindari peringatan ini, alih-alih menggunakan:

parseInt("999", 10);

Anda dapat menggantinya dengan:

Number("999");


Perhatikan bahwa parseInt dan Number memiliki perilaku yang berbeda , tetapi dalam beberapa kasus, satu dapat menggantikan yang lain.

Zanon
sumber
4
Ada juga perbedaan kinerja yang besar antara parseIntdan Number. Ini adalah tes kinerja lama .
Josh Unger
3
Chrome 77: Number()lebih cepat 6x dariparseInt()
Zanon
1
Ini soltion bersih yang berfungsi dengan baik.
thanos.a
43

Saya tidak menjawab pertanyaan dengan benar tetapi, saya pikir masuk akal untuk menjelaskan mengapa kita harus menentukan radix .

Pada dokumentasi MDN kita dapat membaca bahwa:

Jika radix tidak terdefinisi atau 0 (atau tidak ada), JavaScript mengasumsikan sebagai berikut:

  • [...]
  • Jika string input dimulai dengan "0", radix adalah delapan (oktal) atau 10 (desimal). Radix mana yang dipilih tergantung pada implementasi. ECMAScript 5 menentukan bahwa 10 (desimal) digunakan, tetapi belum semua browser mendukung ini. Untuk alasan ini selalu tentukan radix saat menggunakan parseInt.
  • [...]

Sumber: MDN parseInt ()

nmoliveira
sumber
1
Ya tapi kompiler Scripteks akan menyisipkannya, jadi mengapa Anda harus repot-repot?
Spock
2
@Spock Karena TSLint mengeluh bahwa itu tidak ada. Dan kita pergi ke lubang kelinci ...
msanford
Ya benar .. itu sebabnya saya menonaktifkan aturan serat ini. Masih tidak mengerti mengapa parameter OPTIONAL menjatuhkan keluhan serat .. oh well
Spock
4
@Spock Selalu tentukan parameter ini untuk menghilangkan kebingungan pembaca dan untuk menjamin perilaku yang dapat diprediksi. Implementasi yang berbeda menghasilkan hasil yang berbeda ketika radix tidak ditentukan, biasanya nilai defaultnya menjadi 10. Referensi
Andrew Lam
27

Anda dapat mematikan aturan ini jika Anda ingin melewati tes itu.

Memasukkan:

radix: false

Di bawah rulesproperti " " dalam tslint.jsonfile.

Tidak disarankan untuk melakukannya jika Anda tidak memahami pengecualian ini.

Spock
sumber
1
Saya akan menggunakan ini karena kode berjalan dengan baik tanpa radix
William
22

Menambahkan berikut ini di atas file JS Anda akan memberitahu JSHint untuk menekan peringatan radix:

/*jshint -W065 */

Lihat juga: http://jshint.com/docs/#options

aleemb
sumber
2
Opsi jshint apa yang berhubungan dengan ini? Saya menggunakan SublimeLint untuk menjalankan jshint di editor saya, dan hanya membutuhkan hash opsi: pasangan nilai untuk pengaturan itu, jadi saya tidak berpikir saya bisa menerapkan saran "-W065" Anda.
Dihedral
5
Anda dapat menggunakan "-W065": true, misalnya dalam .jshintrcfile.
alexfernandez
29
-1 Tolong jangan lakukan ini, cukup tambahkan radix yang ingin Anda parse
Juan Mendes
Bahasa yang diketik dengan lebih kuat, semakin banyak peluang untuk optimisasi kompiler, itulah sebabnya ia memberi peringatan.
HoldOffHunger
3
dalam JS modern, IMO menambahkan radix sebenarnya membuatnya lebih tidak jelas apa fungsinya. Ada dalam posisi yang Anda harapkan default untuk pergi jika Anda tidak tahu tanda tangan fungsi. Tidak masuk akal bahwa Anda harus menentukan radix.
Charles Offenbacher
5

Saya menyelesaikannya dengan hanya menggunakan + foo, untuk mengkonversi string.

Perlu diingat itu tidak bagus untuk keterbacaan (perbaikan kotor).

console.log( +'1' )
// 1 (int)
pengguna2369834
sumber
3

Anda juga bisa menambahkan baris ini tepat di atas baris parseInt Anda:

// eslint-disable-next-line

Ini akan menonaktifkan pemeriksaan eslint untuk baris berikutnya. Gunakan ini jika Anda hanya perlu melewati satu atau dua baris.

Rohit Nethi
sumber
2

Cukup masukkan string kosong di tempat radix, karena parseInt () mengambil dua argumen:

parseInt (string, radix);

string Nilai untuk diuraikan. Jika argumen string bukan string, maka itu dikonversi ke string (menggunakan operasi abstrak ToString). Ruang kosong terkemuka dalam argumen string diabaikan.

radix Bilangan bulat antara 2 dan 36 yang mewakili radix (dasar dalam sistem angka matematika) dari string yang disebutkan di atas. Tentukan 10 untuk sistem angka desimal yang biasa digunakan oleh manusia. Selalu tentukan parameter ini untuk menghilangkan kebingungan pembaca dan untuk menjamin perilaku yang dapat diprediksi. Implementasi yang berbeda menghasilkan hasil yang berbeda ketika radix tidak ditentukan, biasanya nilai defaultnya adalah 10.

imageIndex = parseInt (id.substring (id.length - 1)) - 1;
imageIndex = parseInt(id.substring(id.length - 1), '')-1;

Ahmed.Dz
sumber
2

Cukup tambahkan aturan khusus Anda di .eslintrc yang terlihat seperti itu "radix": "off" dan Anda akan bebas dari peringatan tanpa pemberitahuan eslint ini. Ini untuk linter eslint.

Goran_Ilic_Ilke
sumber
1

Sebelum ECMAScript 5, parseInt () juga secara otomatis mendeteksi literal oktal, yang menyebabkan masalah karena banyak pengembang menganggap 0 terkemuka akan diabaikan.

Jadi Alih-alih:

var num = parseInt("071");      // 57

Melakukan hal ini:

var num = parseInt("071", 10);  // 71

var num = parseInt("071", 8);

var num = parseFloat(someValue); 

Referensi

SanTom
sumber
0

Alih-alih memanggil substringfungsi yang bisa Anda gunakan.slice()

    imageIndex = parseInt(id.slice(-1)) - 1;

Di sini, -1 dalam slice menunjukkan bahwa untuk memulai slice dari indeks terakhir.

Terima kasih.

Daniel
sumber