Versuchen Sie Folgendes in JavaScript auszuführen:
parseInt('01'); //equals 1
parseInt('02'); //equals 2
parseInt('03'); //equals 3
parseInt('04'); //equals 4
parseInt('05'); //equals 5
parseInt('06'); //equals 6
parseInt('07'); //equals 7
parseInt('08'); //equals 0 !!
parseInt('09'); //equals 0 !!
Ich habe gerade auf die harte Tour gelernt, dass JavaScript denkt, dass die führende Null eine oktale Ganzzahl anzeigt , und da es keine "8"
oder "9"
in Basis-8 gibt, gibt die Funktion Null zurück. Ob es Ihnen gefällt oder nicht, dies ist beabsichtigt .
Was sind die Problemumgehungen?
Hinweis: Der Vollständigkeit halber werde ich eine Lösung veröffentlichen, aber es ist eine Lösung, die ich hasse. Bitte posten Sie andere / bessere Antworten.
Aktualisieren:
Die 5. Ausgabe des JavaScript-Standards ( ECMA-262 ) führt eine grundlegende Änderung ein, die dieses Verhalten beseitigt. Mozilla hat eine gute Zusammenfassung .
javascript
integer
octal
Portman
quelle
quelle
10
(dezimal), es sei denn, der zu analysierenden Zahl wird ein Präfix vorangestellt0x
, z. B.0xFF
in diesem Fall ist der Basisparameter standardmäßig 16. Hoffentlich eines Tages dieses Problem wird eine ferne Erinnerung sein.+'08' === 8
? Wahr! Vielleicht brauchen Sie wirklichparseInt
für Ihren echten Code, aber nicht für die oben genannten.Number('08')
0
oder istundefined
und die Nummer der Zeichenfolge beginnt mit einer0
Ziffer, auf die keinx
oder folgt, oderX
die Implementierung kann die Nummer nach eigenem Ermessen entweder als oktal oder als dezimal interpretieren . Implementierungen werden empfohlen, Zahlen in diesem Fall als dezimal zu interpretieren. " ( meine Betonung)Antworten:
Dies ist eine gängige Javascript-Gotcha mit einer einfachen Lösung:
Geben Sie einfach die Basis oder 'Radix' wie folgt an:
Sie können auch Number verwenden :
quelle
Wenn Sie wissen, dass Ihr Wert im vorzeichenbehafteten 32-Bit-Ganzzahlbereich liegt,
~~x
tun Sie in allen Szenarien das Richtige.Wenn Sie binär not (
~
) nachschlagen , erfordert die Spezifikation eine "ToInt32" -Konvertierung für das Argument, das die offensichtliche Konvertierung in ein Int32 durchführt und angegeben wird, umNaN
Werte auf Null zu zwingen .Ja, das ist unglaublich hackisch, aber so praktisch ...
quelle
Verwenden Sie in der parseInt-Dokumentation das optionale radix-Argument, um base-10 anzugeben:
Das kommt mir pedantisch, verwirrend und wortreich vor (wirklich ein zusätzliches Argument in jeder einzelnen Analyse?), Also hoffe ich, dass es einen besseren Weg gibt.
quelle
parseInt
für die bequeme Verwendung in funktionalen Ausdrücken zu umbrechen , damap
in["7","4","09","5"].map(parseInt);
Map
den Index des Elements im Array als zweites Argument übergeben wird, das vonparseInt
als Basis interpretiert wird, sofern Sie es nicht umschließen.Bearbeiten: Eine eigene Funktion zu erstellen, um das zu tun, was Sie wirklich wollen, ist nur eine Option, wenn Sie dem parseInt () -Aufruf nicht immer die ", 10" hinzufügen möchten. Es hat den Nachteil, dass es sich um eine nicht standardmäßige Funktion handelt: Bequemer für Sie, wenn Sie sie häufig verwenden, aber für andere vielleicht verwirrender.
quelle
Geben Sie die Basis an:
quelle
Wäre es sehr ungezogen, parseInt durch eine Version zu ersetzen, die eine Dezimalzahl annimmt, wenn sie keinen zweiten Parameter hat? (Hinweis - nicht getestet)
quelle
parseInt("0xFFFFFF") === 16777215
aber mit Ihrem ungezogenen Hack funktioniert es nicht mehrparseInt("0xFFFFFF") === 0
und für ein gutes Maß
MDN Link
quelle
Wie wäre es damit für Dezimalstellen:
quelle
Wenn Sie bereits mit parseInt eine Reihe von Codierungen vorgenommen haben und nicht zu allem ", 10" hinzufügen möchten, können Sie die Funktion einfach überschreiben, um Basis 10 als Standard festzulegen:
Dies kann einen späteren Leser verwirren, sodass das Erstellen einer parseInt10 () -Funktion möglicherweise selbsterklärender ist. Persönlich bevorzuge ich die Verwendung einer einfachen Funktion, anstatt ständig ", 10" hinzufügen zu müssen - dies schafft nur mehr Möglichkeiten für Fehler.
quelle
Dieses Problem kann weder in Chrome noch in Firefox (2019) repliziert werden.
quelle