JSLint mówi „brak parametru radix”

538

Uruchomiłem JSLint na tym kodzie JavaScript i powiedział:

Problem w wierszu 32 znaku 30: Brak parametru podstawki.

Oto kod, o którym mowa:

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

Co tu jest nie tak?

Mike Vierwind
źródło

Odpowiedzi:

967

Zawsze dobrą praktyką jest przekazywanie podstawnika za pomocą parsowania -

parseInt(string, radix)

Dla dziesiętnego -

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

Jeśli parametr radix zostanie pominięty, JavaScript przyjmuje następujące założenia:

  • Jeśli ciąg zaczyna się od „0x”, podstawa to 16 (szesnastkowo)
  • Jeśli ciąg zaczyna się od „0”, podstawa to 8 (ósemkowa). Ta funkcja jest przestarzała
  • Jeśli ciąg zaczyna się od dowolnej innej wartości, podstawa wynosi 10 (dziesiętnie)

( Odniesienie )

Jayendra
źródło
7
Z jego dźwięków domyślny IS 10. Jeśli nie zaczyna się od 0x lub 0, domyślnie jest to podstawa równa 10. Ale najlepszym rozwiązaniem jest określenie podstawki, nawet jeśli jest to wartość domyślna, podobnie jak określenie definicji „this” dla funkcji array.map.
molson504x
81
to takie nierozsądne ... zgodnie z tą logiką powinien istnieć trzeci parametr reprezentujący podstawę samego argumentu radix
Nishant
6
Zgadzam się z innymi komentatorami. Dlaczego warto podać wartość podstawową, gdy domyślną wartością jest 10? Jest to sprzeczne ze wspólną konwencją.
Richard Clayton,
9
Dodaj 10 jako podstawkę, aby uzyskać kolejny błąd Redundant radix parameter
strzępienia
2
@Nishant: radixArgument jest wartością liczbową, a nie ciągiem reprezentującym wartość liczbową, więc nie ma podstawki do określenia.
tokland
79

Aby uniknąć tego ostrzeżenia, zamiast używać:

parseInt("999", 10);

Możesz go zastąpić:

Number("999");


Zauważ, że parseInt i Number mają różne zachowania , ale w niektórych przypadkach jedno może zastąpić drugie.

Zanon
źródło
4
Istnieją również duże różnice wydajności między parseInti Number. Oto stary test wydajności .
Josh Unger
3
Chrome 77: Number()jest 6 razy szybszy niżparseInt()
Zanon
1
To czyste rozwiązanie, które działa dobrze.
thanos.a
43

Nie odpowiadam poprawnie na pytanie, ale myślę, że sensowne jest wyjaśnienie, dlaczego powinniśmy określić podstawkę .

W dokumentacji MDN możemy przeczytać, że:

Jeśli podstawa jest niezdefiniowana lub 0 (lub nieobecna), JavaScript zakłada:

  • [...]
  • Jeśli ciąg wejściowy zaczyna się od „0”, podstawa to osiem (ósemka) lub 10 (dziesiętnie). To, która podstawa jest wybrana, zależy od implementacji. ECMAScript 5 określa, że ​​używana jest liczba 10 (dziesiętna), ale nie wszystkie przeglądarki obsługują to jeszcze. Z tego powodu zawsze określaj podstawę podczas używania parseInt.
  • [...]

Źródło: MDN parseInt ()

nmoliveira
źródło
1
Tak, ale kompilator maszynopisu go wstawi, więc dlaczego miałbyś się tym przejmować?
Spock
2
@Spock Ponieważ TSLint narzeka, że ​​go tam nie ma. I w dół króliczej nory idziemy ...
msanford,
Tak, prawda… dlatego właśnie wyłączam tę zasadę. Nadal nie rozumiem, dlaczego parametr OPCJONALNY wyzwala skargę na kłaczki. No cóż
Spock
4
@Spock Zawsze określ ten parametr, aby wyeliminować nieporozumienia z czytelnikiem i zagwarantować przewidywalne zachowanie. Różne implementacje dają różne wyniki, gdy podstawa nie jest określona, ​​zwykle przyjmując domyślną wartość 10. Odniesienie
Andrew Lam
27

Możesz wyłączyć tę regułę, jeśli chcesz pominąć ten test.

Wstawić:

radix: false

W ramach ruleswłaściwości „ ” w tslint.jsonpliku.

Nie zaleca się tego, jeśli nie rozumiesz tego wyjątku.

Spock
źródło
1
Użyję tego, ponieważ kod działa dobrze bez radix
William
22

Dodanie następującego na górze pliku JS powie JSHint, aby pomijał ostrzeżenie o radix:

/*jshint -W065 */

Zobacz także: http://jshint.com/docs/#options

aleemb
źródło
2
Jakiej opcji jshint to dotyczy? Używam SublimeLint do uruchomienia jshint w moim edytorze, a to wymaga tylko skrótu opcji: par wartości dla jego ustawienia, więc nie sądzę, żebym mógł zastosować twoją sugestię „-W065”.
Dihedral
5
Możesz użyć "-W065": truenp. W .jshintrcpliku.
alexfernandez
29
-1 Nie rób tego, po prostu dodaj podstawkę, którą chcesz przeanalizować
Juan Mendes,
Im silniej napisany język, tym więcej możliwości optymalizacji kompilatora, dlatego rzuca ostrzeżenie.
HoldOffHunger,
3
we współczesnym JS dodanie IMO przez radix sprawia, że ​​bardziej niejasne jest działanie tej funkcji. Jest w pozycji, w której możesz oczekiwać domyślnej wartości, jeśli nie znasz sygnatury funkcji. Nie ma sensu, że musisz podać podstawę.
Charles Offenbacher
5

Rozwiązałem to za pomocą + foo, aby przekonwertować ciąg.

Pamiętaj, że nie jest to świetne dla czytelności (brudna poprawka).

console.log( +'1' )
// 1 (int)
użytkownik2369834
źródło
3

Możesz także po prostu dodać tę linię bezpośrednio nad linią parsowania:

// eslint-disable-next-line

Spowoduje to wyłączenie sprawdzania eslint dla następnej linii. Użyj tego, jeśli potrzebujesz tylko pominąć jedną lub dwie linie.

Rohit Nethi
źródło
2

Po prostu umieść pusty ciąg w miejscu Radix, ponieważ parseInt () przyjmuje dwa argumenty:

parseInt (ciąg, podstawa);

ciąg Wartość do przeanalizowania. Jeśli argument ciągu nie jest ciągiem, jest on konwertowany na ciąg (za pomocą operacji abstrakcyjnej ToString). Wiodące białe znaki w argumencie ciągu są ignorowane.

podstawa Liczba całkowita od 2 do 36, która reprezentuje podstawkę (podstawa w matematycznych systemach liczbowych) wyżej wymienionego łańcucha. Podaj 10 dla dziesiętnego systemu liczbowego powszechnie używanego przez ludzi. Zawsze określaj ten parametr, aby wyeliminować zamieszanie czytnika i zagwarantować przewidywalne zachowanie. Różne implementacje dają różne wyniki, gdy podstawa nie jest określona, ​​zwykle przyjmując domyślną wartość 10.

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

Ahmed.Dz
źródło
2

Po prostu dodaj swoją niestandardową regułę do .eslintrc, która tak wygląda, "radix": "off" a będziesz wolny od tego ostrzeżenia o niepowodzeniu eslint. To jest dla okładziny eslint.

Goran_Ilic_Ilke
źródło
1

Przed ECMAScript 5 parseInt () również automatycznie wykrywał literały ósemkowe, co powodowało problemy, ponieważ wielu programistów zakładało, że wiodące zero będzie ignorowane.

Zamiast:

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

Zrób to:

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

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

var num = parseFloat(someValue); 

Odniesienie

SanTom
źródło
0

Zamiast wywoływać substringfunkcję, której możesz użyć.slice()

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

Tutaj -1 w wycinku oznacza, że ​​aby rozpocząć wycinek od ostatniego indeksu.

Dzięki.

Daniel
źródło