JSLint sagt "fehlender Radix-Parameter"

538

Ich habe JSLint mit diesem JavaScript-Code ausgeführt und es stand:

Problem in Zeile 32, Zeichen 30: Fehlender Radix-Parameter.

Dies ist der fragliche Code:

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

Was ist hier falsch?

Mike Vierwind
quelle

Antworten:

967

Es ist immer eine gute Praxis, radix mit parseInt zu übergeben -

parseInt(string, radix)

Für Dezimalstellen -

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

Wenn der Radix-Parameter weggelassen wird, geht JavaScript von Folgendem aus:

  • Wenn die Zeichenfolge mit "0x" beginnt, ist der Radix 16 (hexadezimal)
  • Wenn die Zeichenfolge mit "0" beginnt, ist der Radix 8 (oktal). Diese Funktion ist veraltet
  • Wenn die Zeichenfolge mit einem anderen Wert beginnt, beträgt der Radix 10 (dezimal).

( Referenz )

Jayendra
quelle
7
Nach den Sounds ist der Standardwert 10. Wenn er nicht mit 0x oder 0 beginnt, wird standardmäßig ein Radix von 10 verwendet. Es wird jedoch empfohlen, einen Radix anzugeben, auch wenn es sich um den Standardwert handelt Angabe der Definition von "this" für eine array.map-Funktion.
Molson504x
81
das ist so unvernünftig ... nach dieser Logik sollte es einen dritten Parameter geben, der den Radix des Radix-Arguments selbst darstellt
Nishant
6
Stimmen Sie anderen Kommentatoren zu. Warum ist es gut, einen Radix-Wert anzugeben, wenn der Standardwert 10 ist? Dies widerspricht der üblichen Konvention.
Richard Clayton
9
Addiere 10 als Radix, um einen weiteren Redundant radix parameter
Flusenfehler
2
@Nishant: Das radixArgument ist ein numerischer Wert, keine Zeichenfolgendarstellung eines numerischen Werts, daher muss kein Radix angegeben werden.
Tokand
79

Um diese Warnung zu vermeiden, anstatt Folgendes zu verwenden:

parseInt("999", 10);

Sie können es ersetzen durch:

Number("999");


Beachten Sie, dass parseInt und Number sich unterschiedlich verhalten . In einigen Fällen kann jedoch eines das andere ersetzen.

Zanon
quelle
4
Es gibt auch große Leistungsunterschiede zwischen parseIntund Number. Hier ist ein alter Leistungstest .
Josh Unger
3
Chrome 77: Number()ist 6x schneller alsparseInt()
Zanon
1
Dies ist eine saubere Lösung, die gut funktioniert.
thanos.a
43

Ich beantworte die Frage nicht richtig, aber ich denke, es ist sinnvoll zu klären, warum wir den Radix angeben sollten .

In der MDN-Dokumentation können wir Folgendes lesen:

Wenn radix undefiniert ist oder 0 ist (oder fehlt), geht JavaScript von Folgendem aus:

  • [...]
  • Wenn die Eingabezeichenfolge mit "0" beginnt, ist der Radix acht (oktal) oder 10 (dezimal). Welcher Radix genau gewählt wird, hängt von der Implementierung ab. ECMAScript 5 gibt an, dass 10 (dezimal) verwendet wird, dies wird jedoch noch nicht von allen Browsern unterstützt. Geben Sie daher bei Verwendung von parseInt immer einen Radix an.
  • [...]

Quelle: MDN parseInt ()

nmoliveira
quelle
1
Ja, aber der Typescript-Compiler fügt es ein. Warum sollten Sie sich also die Mühe machen?
Spock
2
@Spock Weil TSLint sich beschwert, dass es nicht da ist. Und das Kaninchenloch hinunter gehen wir ...
msanford
Ja, wahr ... deshalb deaktiviere ich einfach diese Flusenregel. Ich verstehe immer noch nicht, warum ein OPTIONAL-Parameter eine Flusenbeschwerde auslöst. Na ja
Spock,
4
@Spock Geben Sie diesen Parameter immer an, um Verwirrung beim Leser zu vermeiden und ein vorhersehbares Verhalten zu gewährleisten. Unterschiedliche Implementierungen führen zu unterschiedlichen Ergebnissen, wenn kein Radix angegeben wird. Der Standardwert ist normalerweise 10. Referenz
Andrew Lam
27

Sie können diese Regel deaktivieren, wenn Sie diesen Test überspringen möchten.

Einfügen:

radix: false

Unter der rulesEigenschaft " " in der tslint.jsonDatei.

Es wird nicht empfohlen, dies zu tun, wenn Sie diese Ausnahme nicht verstehen.

Spock
quelle
1
Ich werde dies verwenden, da Code ohne Radix gut läuft
William
22

Wenn Sie Folgendes zu Ihrer JS-Datei hinzufügen, wird JSHint angewiesen, die Radix-Warnung zu unterdrücken:

/*jshint -W065 */

Siehe auch: http://jshint.com/docs/#options

Aleemb
quelle
2
Welcher jshint-Option entspricht dies? Ich verwende SublimeLint, um jshint in meinem Editor auszuführen, und es wird nur ein Hash von Option: Wertepaaren für die Einstellung benötigt, sodass ich nicht glaube, dass ich Ihren Vorschlag "-W065" anwenden kann.
Dieder
5
Sie können "-W065": truezB in einer .jshintrcDatei verwenden.
Alexanderfern
29
-1 Bitte tun Sie dies nicht, fügen Sie einfach den Radix hinzu, den Sie analysieren möchten
Juan Mendes
Je stärker eine Sprache typisiert ist, desto mehr Möglichkeiten zur Compileroptimierung gibt es, weshalb die Warnung ausgegeben wird.
HoldOffHunger
3
Im modernen JS macht das Hinzufügen des Radix durch IMO tatsächlich unklarer, was die Funktion tut. Es befindet sich in der Position, in der Sie möglicherweise einen Standardwert erwarten, wenn Sie die Funktionssignatur nicht kennen. Es macht keinen Sinn, dass Sie einen Radix angeben müssen.
Charles Offenbacher
5

Ich habe es mit nur + foo gelöst, um den String zu konvertieren.

Denken Sie daran, es ist nicht gut für die Lesbarkeit (Dirty Fix).

console.log( +'1' )
// 1 (int)
user2369834
quelle
3

Sie können diese Zeile auch einfach direkt über Ihrer parseInt-Zeile hinzufügen:

// eslint-disable-next-line

Dadurch wird die Eslint-Prüfung für die nächste Zeile deaktiviert. Verwenden Sie diese Option, wenn Sie nur eine oder zwei Zeilen überspringen müssen.

Rohit Nethi
quelle
2

Fügen Sie einfach eine leere Zeichenfolge an die Stelle des Radix ein, da parseInt () zwei Argumente akzeptiert:

parseInt (string, radix);

string Der zu analysierende Wert. Wenn das Zeichenfolgenargument keine Zeichenfolge ist, wird es in eine Zeichenfolge konvertiert (mithilfe der abstrakten Operation ToString). Führende Leerzeichen im Zeichenfolgenargument werden ignoriert.

radix Eine Ganzzahl zwischen 2 und 36, die den Radix (die Basis in mathematischen Zahlensystemen) der oben genannten Zeichenfolge darstellt. Geben Sie 10 für das Dezimalzahlensystem an, das üblicherweise von Menschen verwendet wird. Geben Sie diesen Parameter immer an, um Verwirrung beim Leser zu vermeiden und ein vorhersehbares Verhalten zu gewährleisten. Unterschiedliche Implementierungen führen zu unterschiedlichen Ergebnissen, wenn kein Radix angegeben wird. Der Standardwert ist normalerweise 10.

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

Ahmed.Dz
quelle
2

Fügen "radix": "off" Sie einfach Ihre benutzerdefinierte Regel in .eslintrc hinzu, die so aussieht, und Sie sind frei von dieser unauffälligen Warnung. Dies ist für den Eslint-Linter.

Goran_Ilic_Ilke
quelle
1

Vor ECMAScript 5 erkannte parseInt () auch automatisch Oktalliterale, was zu Problemen führte, da viele Entwickler davon ausgegangen waren, dass eine führende 0 ignoriert würde.

Also statt:

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

Mach das:

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

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

var num = parseFloat(someValue); 

Referenz

SanTom
quelle
0

Anstatt die substringFunktion aufzurufen, die Sie verwenden könnten.slice()

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

Hier gibt -1 in Slice an, dass Slice vom letzten Index aus gestartet werden soll.

Vielen Dank.

Daniel
quelle