JSLint “eksik radix parametresi” diyor


538

Bu JavaScript kodunda JSLint koştum ve dedi:

32. satırdaki sorun 30: Eksik radix parametresi.

Söz konusu kod:

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

Burada yanlış olan ne?

Yanıtlar:


967

ParseInt ile sayı tabanı geçmek her zaman iyi bir uygulamadır -

parseInt(string, radix)

Ondalık için -

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

Radix parametresi atlanırsa, JavaScript aşağıdakileri kabul eder:

  • Dize "0x" ile başlıyorsa, yarıçap 16'dır (onaltılık)
  • Dize "0" ile başlarsa, yarıçap 8'dir (sekizli). Bu özellik kullanımdan kaldırıldı
  • Dize başka bir değerle başlarsa, sayı tabanı 10'dur (ondalık)

( Referans )


7
Seslerinden varsayılan IS 10 ise, 0x veya 0 ile başlamazsa, varsayılan değer 10'dur. Ancak varsayılan değer olsa bile bir sayı belirtmek en iyi yöntemdir. bir array.map işlevine "this" tanımını belirterek.
molson504x

81
bu mantıksız ... bu mantıkla, sayı tabanı bağımsız değişkeninin kendisinin tabanını temsil eden üçüncü bir parametre olmalı
Nishant

6
Diğer yorumcularla anlaşın. Varsayılan değer 10 olduğunda bir sayı tabanı değeri sağlamak neden iyidir? Bu ortak konvansiyona meydan okuyor.
Richard Clayton

9
Başka bir tiftik hatası almak için sayı Redundant radix parameter
tabanı

2
@Nishant: Bağımsız radixdeğişken sayısal bir değerdir, sayısal değerin dize olarak temsil edilmesidir, bu nedenle belirtilecek sayı tabanı yoktur.
tokland

79

Kullanmak yerine bu uyarıyı önlemek için:

parseInt("999", 10);

Şununla değiştirebilirsiniz:

Number("999");


ParseInt ve Number öğelerinin farklı davranışları olduğunu , ancak bazı durumlarda birinin diğerini değiştirebileceğini unutmayın.


4
Arasında büyük performans farklılıkları da vardır parseIntve Number. İşte eski bir performans testi .
Josh Unger

3
Chrome 77: Number()6 kat daha hızlıparseInt()
Zanon

1
Bu gayet iyi çalışan temiz bir çözümdür.
thanos.a

43

Soruyu doğru bir şekilde cevaplamıyorum, ancak neden yarıçapı belirtmemiz gerektiğini anlamak mantıklı .

MDN belgelerinde şunları okuyabiliriz:

Sayı tabanı tanımsızsa veya 0 (veya yoksa), JavaScript aşağıdakileri varsayar:

  • [...]
  • Giriş dizesi "0" ile başlarsa, yarıçap sekiz (sekizli) veya 10 (ondalık) olur. Tam olarak hangi yarıçap seçilirse uygulamaya bağlıdır. ECMAScript 5, 10 (ondalık) kullanıldığını belirtir, ancak henüz tüm tarayıcılar bunu desteklemez. Bu nedenle parseInt kullanırken her zaman bir radix belirtin.
  • [...]

Kaynak: MDN parseInt ()


1
Evet, ancak Typescript derleyicisi ekleyecek, o zaman neden rahatsız edesin ki?
Spock

2
@Spock Çünkü TSLint orada olmadığından şikayet ediyor. Ve tavşan deliğinden aşağı gidiyoruz ...
msanford

Evet, bu yüzden bu tiftik kuralını devre dışı bırakıyorum. Hala bir İSTEĞE BAĞLI parametrenin neden tiksindirici bir şikayeti tetiklediğini anlamıyorum .. oh iyi
Spock

4
@Spock Okuyucu karmaşasını ortadan kaldırmak ve öngörülebilir davranışı garanti etmek için her zaman bu parametreyi belirtin. Bir yarıçap belirtilmediğinde farklı uygulamalar, genellikle değeri 10 olarak varsayılan olarak farklı sonuçlar üretir. Referans
Andrew Lam

27

Bu testi atlamak istiyorsanız bu kuralı kapatabilirsiniz.

ekle:

radix: false

Dosyadaki " rules" özelliğinin altında tslint.json.

Bu istisnayı anlamadıysanız bunu yapmanız önerilmez.


1
Kod yarıçap olmadan gayet iyi çalıştığı için bunu kullanacağım
William

22

JS dosyanızın üstüne aşağıdakileri eklemek JSHint'e sayı tabanı uyarısını bastırmasını söyleyecektir:

/*jshint -W065 */

Ayrıca bkz: http://jshint.com/docs/#options


2
Bu hangi jshint seçeneğine karşılık geliyor? Düzenleyicimde jshint'i çalıştırmak için SublimeLint kullanıyorum ve bu seçenek sadece bir karma alır: ayarı için değer çiftleri, bu yüzden "-W065" önerinizi uygulayabileceğimi sanmıyorum.
Dihedral

5
Sen kullanabilirsiniz "-W065": truebir de örneğin, .jshintrcdosyaya.
alexfernandez

29
-1 Lütfen bunu yapmayın, sadece ayrıştırmak istediğiniz yarıçapı ekleyin
Juan Mendes

Bir dil ne kadar güçlü yazılırsa, derleyici optimizasyonu için o kadar fazla fırsat olur, bu yüzden uyarıyı fırlatır.
HoldOffHunger

3
Modern JS'de, radix eklemek IMO aslında işlevin ne yaptığını daha net hale getirir. İşlev imzasını bilmiyorsanız bir varsayılanın gitmesini beklediğiniz konumdadır. Bir yarıçap belirtmeniz mantıklı değildir.
Charles Offenbacher

5

Dize dönüştürmek için sadece + foo kullanarak çözdüm.

Okunabilirlik için harika olmadığını unutmayın (kirli düzeltme).

console.log( +'1' )
// 1 (int)

3

Ayrıca, bu satırı ayrıştırma satırınızın hemen üstüne de ekleyebilirsiniz:

// eslint-disable-next-line

Bu, sonraki satır için eslint kontrolünü devre dışı bırakır. Yalnızca bir veya iki satırı atlamanız gerekiyorsa bunu kullanın.


2

Sayı tabanı yerine boş bir dize koyun, çünkü parseInt () iki argüman alır:

parseInt (dize, sayı tabanı);

string Ayrıştırılacak değer. Dize bağımsız değişkeni bir dize değilse, bir dizeye dönüştürülür (ToString soyut işlemini kullanarak). Dize bağımsız değişkeninde önde gelen boşluk yoksayılır.

radix Yukarıda belirtilen dizenin yarıçapını (matematiksel sayısal sistemlerde temel) temsil eden 2 ile 36 arasında bir tam sayı. İnsanlar tarafından yaygın olarak kullanılan ondalık sayı sistemi için 10 belirtin. Okuyucu karmaşasını ortadan kaldırmak ve öngörülebilir davranışı garanti etmek için her zaman bu parametreyi belirtin. Bir yarıçap belirtilmediğinde farklı uygulamalar, genellikle değeri 10 olarak varsayılan olarak farklı sonuçlar üretir.

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


2

Özel kuralınızı buna benzeyen "radix": "off" .eslintrc dosyasına ekleyin ve bu esnint unnesesery uyarısından muaf olacaksınız. Bu eslint linter için.


1

ECMAScript 5'ten önce, parseInt () aynı zamanda sekizlik değişmezleri de otomatik olarak algıladı, bu da birçok geliştiricinin önde 0'ın göz ardı edileceğini varsaydığı için sorunlara neden oldu.

Bunun yerine:

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

Bunu yap:

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

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

var num = parseFloat(someValue); 

Referans


0

substringKullanabileceğiniz işlevi çağırmak yerine.slice()

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

Burada, dilimdeki -1, son dizinden dilimin başlatılmasını belirtir.

Teşekkürler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.