molily: Operatoren und Typumwandlungen, war: Klausur-Spickzettel

Beitrag lesen

Hallo,

dieses Posting ist eine Antwort auf einen gelöschten Spickzettel, an dem sich verschiedene häufige JavaScript-Missverständnisse zeigen lassen.

<html>

Davor fehlt die DOCTYPE-Angabe:
<!DOCTYPE html>

var a = parseFloat(Zahl1.value);
                 var b = 0;
                 if (a<b){

parseFloat ist hier unnötig, der Operator < wandelt die Operanden mittels Number() (intern ToNumber) in Number-Werte um, ausgenommen beide Operanden sind Strings.

ToNumber ist dabei allerdings nicht so fehlertolerant wie parseFloat; wenn z.B. Buchstaben nach der Zahl folgen, kommt NaN heraus:
parseFloat(" 123.4asdf ") ergibt 123.4
Number(" 123.4asdf ") ergibt NaN wegen dem »asdf«, die Leerzeichen sind okay

Beide können keine Zahlen mit Kommas als Dezimaltrenner parsen:
"123,4" > 0 ergibt false, weil Number("123,4") NaN ergibt.

Eingabewerte zuverlässig umwandeln kann man also mit beide nicht!

(Quellen: Abstract Relational Comparison Algorithm, parseFloat, ToNumber ff.)

if (a==b){

Wenn beim Vergleichsoperator == ein Operand eine Number ist, dann wird der andere Wert automatisch in Number umgewandelt. Auch hier ist keine explizite Typumwandlung nötig.

(Quellen: Abstract Equality Comparison Algorithm, JS Coercion Tool)

function FensterOeffnen (TF1){
            var MeinFenster = window.open("","Zweitfenster",
                              "width=300,height=200,scrollbars=yes");

Popup-Fenster sind nicht mehr zeitgemäß. Wieso wird euch das beigebracht? So etwas hat man vor 10 Jahren gemacht. DOM-Manipulationen wären angebracht. Eine angemessene Aufgabe wäre: Geben Sie den Wert in einem Element unterhalb des Formulars aus.

MeinFenster.document.write("<html><head><title>neues Fenster</title></head>");
            MeinFenster.document.write("<body bgcolor='#00ff00'>")
            MeinFenster.document.write("<p align='center'>");

Attribute zur direkten Beeinflussung der Präsentation wie bgcolor und align sind schlechter Stil, das vergisst du am besten gleich wieder. Formatierungen nimmt man mit ausgelagertem CSS vor. Da ihr SELFHTML benutzen dürft: http://de.selfhtml.org/css/@title=http://de.selfhtml.org/css/

MeinFenster.document.write("Hallo<br>");
            MeinFenster.document.write(TF1.value)
            MeinFenster.document.write("</p>");
            MeinFenster.document.write("</body>");
            MeinFenster.document.write("</html>");

Wie wäre es, den String zuerst zusammenzubauen und dann mit *einem* write-Aufruf in das Fenst zu schreiben. Außerdem wäre der Aufruf von http://de.selfhtml.org/javascript/objekte/document.htm#open@title=document.open und http://de.selfhtml.org/javascript/objekte/document.htm#close@title=document.close angebracht.

<script language="javascript">

Es sollte <script type="text/javascript"> heißen, oder du lässt sämtliche Attribut weg, wenn du HTML5 schreibst.

function fkt( ){

Eine Funktion solltest du nie »fkt« nennen sondern danach, was sie tut.

var i=0
         while (i<100){
         var
         MeinFenster = window.open("","Zweitfenster",
                              "width=300,height=200,scrollbars=yes");

Hier rufst du 100 mal window.open auf. Das ist Quatsch, dieser Aufruf darf nicht in die Schleife.

i=i+1;
            if (i%6 !=0){
            if (i%10 !=6){
            if (parseInt (i/10)%10 !=6){

Welchen Zweck erfüllt das? Schließe 60 bis 69 aus? Das ginge auch einfacher.

MeinFenster.document.write(i);
                 MeinFenster.document.write("<br>");
                 MeinFenster.document.write("<html>");
                 MeinFenster.document.write("<body bgcolor='003300' text='C0B2C0'>");
                 MeinFenster.document.write("</body>");
                 MeinFenster.document.write("</html>");

Hier schreibst du 100 Mal ein neues Dokument ins Fenster, zumal in einer verquerten Reihenfolge. Die Ausgabe von <html><body> muss vor die Schleife und die Ausgabe von </body></html> danach.

<html>
<head>
<script language="javascript">
   function Rechnung(Anz1,Anz2,GPreis1,GPreis2,EPreis1,EPreis2,Summe){
   GPreis1.value=parseFloat(Anz1.value)*parseFloat(EPreis1.value);
   GPreis2.value=parseFloat(Anz2.value)*parseFloat(EPreis2.value);
   Summe.value=parseFloat(GPreis1.value)+parseFloat(GPreis2.value);

Der Operator * wandelt automatisch alle Operanden in Number-Werte um. Wenn du hier Variablen für die Zwischenwerte verwenden würdest, kannst du dir auch das parseFloat sparen. (Dort ist es ansonsten angebracht, weil + Strings verkettet, sobald ein Operand ein String ist.)

Grüße,
Mathias