Supportnet Computer
Planet of Tech

Supportnet / Forum / Skripte(PHP,ASP,Perl...)

JavaScriptfrage





Frage

Hallo. Eine Zeichenkette, die in einer Variablen namens Dat gespeichert ist, kann ab der 7. Stelle eine Jahreszahl enthalten. Dort kann aber auch Text gespeichert sein, der nicht als Zahl interpretierbar ist. Wenn dort eine Zahl gespeichert ist und diese Zahl negativ ist, soll die Zahl um ein erhöht werden und in der Variablen Datjahr gespeichert werden. Wenn dort eine positive Zahl gespeichert ist soll diese positive Zahl in Dat gespeichert werden. (Die 0 kann dort nicht stehen.) Falls sich die Zeichenkette nicht als Zahl interpretieren lässt, soll in Datjahr "NaN" gespeichert werden. Zur Zeit verwende ich folgendes: [code] Datjahr=parseInt(Dat.slice(6)); if (Datjahr<0) Datjahr++;[/code] Ist das korrekt so? Oder kann es einen Fehler geben bei der Prüfung ob [b]"NaN"<0[/b]? In den Browsern, in denen ich bisher getestet habe, funktioniert es. Aber natürlich kann ich nicht in allen Browsern und allen Versionen testen. Es sollte aber auch nicht nur funktionieren, sondern auch regelkonform sein.

Antwort 1 von isNaN

ich würde dies empfehlen:

Datjahr=parseInt(Dat.slice(6));
if (!isNaN(Datjahr) && Datjahr<0) Datjahr++;

dann wird erst auf isNaN geprüft und nur wenn dies negativ verläuft erfolgt die Prüfung auf <0, da die JavaScript-Interpreter die Bedingungen von links abarbeiten und bei && die weitere Überprüfung abbrechen (müssen), sowie eine Bedingung nicht erfüllt ist.

Dass es auch so klappt liegt wohl daran, dass ggf. "NaN" als String mit "0" verglichen wird.

Antwort 2 von Friedel

Daran habe ich auch schon gedacht, aber da ähnliche Prüfungen recht oft gemacht werden, würde mich interessieren, ob die Prüfung, so wie ich sie mache, regelkonform ist..
Zitat:
Dass es auch so klappt liegt wohl daran, dass ggf. "NaN" als String mit "0" verglichen wird.
Sicher nicht. Die Bedingungen
"NaN"<0
"NaN"==0
und
"NaN">0
sind alle nicht erfüllt. In allen gängigen Browsern funktioniert sowas auch ohne Beanstandungen. Sie eigentliche Frage ist also, ob diese Prüfungen zulässig sind. Darf man diese Vergleichsoperatoren anwenden auf Variablen, von denen man nicht sicher weiß ob deren Werte numerisch sind? Ich kann in den Standards dazu nichts finden. Ich finde weder eine Aussage nach der man die Operatoren nur auf Zahlen anwenden darf, noch eine Aussage, die das Gegenteil erlaubt.

Antwort 3 von Supermax

Strenggenommen müßte der Vergleich einer Zahl mit "Not A Number" als Ergebnis "undefined" ergeben. In den mir bekannten JavaScript-Implementierungen ist aber
if(undefined) ...
äquivalent mit
if(false)... 
.

Antwort 4 von Friedel

Danke. Jetzt fehlt mir nur noch ein Link, wo man die genaue Festlegung nachlesen kann. Ich habe bei ECMA leider nichts gefunden.

Antwort 5 von isNaN

@Supermax:
worauf beruht deine Aussage?

Antwort 6 von Supermax

Meine Aussage ging einfach von der streng mathematischen Definition aus. Korrekt ist diese Angabe:

Zitat:
NaN is not equal to anything, including NaN.


(Quelle: http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:...)

Das sollte deine Frage jedenfalls beantworten.

Antwort 7 von isNaN

ausgehend von ein bisschen elementarer Logik muss ich deine Vermutung verneinen.

Nur weil NaN != alles (incl. NaN) ist kannst du daraus nicht direkt ableiten, dass auch alle anderen Vergleichsoperatoren grundsätzlich false liefern. Nur über == und === (und die Inversion sic) sind bzgl. NaN Aussagen gemacht.

Antwort 8 von Supermax

Laut ]ECMAScript Spezifikation ergibt ein Vergleich, bei dem einer der beiden Operanden "NaN" ist, als Ergebnis "undefined" (Punkt 11.8.5, S.65f)

Antwort 9 von Friedel

Danke. Der Link in Antwort 8 hat die Lösung gebracht. Auf Seite 53 steht dort:

Zitat:
11.8.1 The Less-than Operator ( < )
The production RelationalExpression : RelationalExpression < ShiftExpression is evaluated as follows:
1. Evaluate RelationalExpression.
2. Call GetValue(Result(1)).
3. Evaluate ShiftExpression.
4. Call GetValue(Result(3)).
5. Perform the comparison Result(2) < Result(4). (see 11.8.5)
6. If Result(5) is undefined, return false. Otherwise, return Result(5).


Punkt 6 besagt, dass ich mir zu viel Gedanken gemacht habe. Die gesonderte Behandlung des Falles NaN ist nicht nötig.
if (!isNaN(Datjahr) && Datjahr<0) Datjahr++;
ist also das gleiche wie
if (Datjahr<0) Datjahr++;


Antwort 10 von Friedel

Mist. 11.8.1 und 11.8.5 führen zu unterschiedlichen Ergebnissen :-( Das darf eigentlich nicht sein. Jetzt muss ich also feststellen, was mit
Zitat:
The Abstract Relational Comparison Algorithm
gemeint ist.

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Suche in allen vorhandenen Beiträgen: