Christine Kuehnel: parseInt - Bug oder Mißverständnis

Beitrag lesen

Hallo,

Ich hatte zwar auch schon an was Oktales gedacht, aber ich konnte es nicht recht glauben. Wirklich ne fiese Falle!

Bisschen hinterhaeltig, die Syntax, ja.

die Falle ist noch 'ne Spur fieser:
Uebergibt man parseInt() Werte mit fuehrender Null, so interpretiert er sie oktal, ohne die fuehrende Null wird alles automatisch dezimal interpretiert,

Stimmt fast, hexadezimal gibt es auch noch (wie das geht, kommt hier gleich noch).

das steht aber dann nirgendwo mehr, das erfaehrt man nur durch ausprobieren.
Und noch ein Nachtrag: den Parameter "Base" habe ich im "JavaScript Guide" zum Netscape Navigator Version 4.0 unter parseInt() als optionalen Parameter "radix" gefunden, diese Sonderfunktionalitaet der Zeichenkette, um die sich dieser Thread dreht ist aber nicht dokumentiert.

Doch, steht tatsaechlich beschrieben - "Client-Side JavaScript Reference" :
"if the radix is not specified or is specified as 0, JavaScript assumes the following:
     If the input string begins with "0x", the radix is 16 (hexadecimal).
     If the input string begins with "0", the radix is eight (octal).
     If the input string begins with any other value, the radix is 10 (decimal).
  If the first character cannot be converted to a number, parseInt returns NaN."

----------------------

Aber es gibt noch mehr solche "Scherze". Wenn man z.B. in einer Zeichenkette eine Zahl hat, dann kann man nachdem man sie extrahiert hat (ueber split()), davon zwar ohne Probleme subrahieren, eine Addition ist aber nicht so ohne weiteres moeglich.

(ich habe beim Zitieren mal ein bisschen umsortiert wegen der Anschaulichkeit)

var Datum     = "1998-12-31";
  var arrDatum = Datum.split("-");
  var Jahr        = arrDatum[0];

»»   ...

(1) var BspJahrZwei = Jahr + 1;
  (2) var BspJahrEins = Jahr - 1;
  (3) var BspJahrDrei = Jahr - 1 + 2;

var AusgDatum = BspJahrZwei + "-" + Monat + "-" + Tag;
  ...ausgegeben: "19981-12-31"
 var AusgDatum = BspJahrEins + "-" + Monat + "-" + Tag;

»»   ... ausgegeben: "1997-12-31";

var AusgDatum = BspJahrDrei + "-" + Monat + "-" + Tag;
  ...ausgegeben: "1999-12-31"

Verrueckt oder?

Verblueffend. Schon.
Verrueckt? Weniger.
Was passiert hier?
JavaScript kennt keine Typfestlegung von Variablen per Deklaration.
Typ wird aus dem Kontext heraus waehrend der Ausfuehrung festgelegt.

Im Beispiel ist Jahr  vom Typ string, der Wert ist "1998".
(1) Operator "+" verknuepft Strings
     "1998" + "1"  = "19981"  
(2) Operator "-" kann keine Strings verknuepfen, den gibt es naemlich dafuer nicht, also
     wird "1998" zu integer 1998 konvertiert
     1998 - 1 = 1997
(3) 1998 - 1 = 1997     /   1997 + 2 = 1999   (Operationen von links nach rechts)

Die Zuweisung zu AusgDatum ist in allen drei Faellen wieder  Verknuepfung von Strings durch "+". Und damit sind die Ergebnisse alle nachvollziehbar, oder?

Gruss
Christine