Script trotzdem ausführen, auch wenn Variable nicht da ist, nicht existiert!
bearbeitet von Rolf BHallo Franz,
~~~js
if (typeof element.value == 'undefined') {
...
}
~~~
das würde Dir isoliert betrachtet tatsächlich helfen, aber das Ergebnis wäre unterm Strich nicht ordentlich. Es funktioniert nämlich nur, wenn dieses `|| 0` beim Aufruf von getInputAsFloat stehen bleibt, das sollte es aber nicht. Ich beantworte mal einen Teil meiner Fragen von vorhin:
> Frage 1: Welcher Wert entsteht aus document.formular_n.Wert4n, wenn es das Feld Wert4n nicht gibt?
*Das Ergebnis ist `undefined`*
> Frage 2: Und welcher Wert entsteht dann aus document.formular_n.Wert4n || 0?
*Da `undefined` als falsy betrachtet wird (siehe auch meinen Abschnitt ["Was ist Wahrheit"](https://wiki.selfhtml.org/wiki/JavaScript/Objekte/Boolean#Was_ist_Wahrheit.3F) im Self-Wiki), gibt der `||` Operator seinen rechten Operanden zurück. Der Wert des Ausdrucks ist daher 0.*
> Frage 4: Ist das || 0 in Frage 2 eine gute Idee?
*Nein. Der Ausdruck liefert dann entweder ein Objekt vom Typ HTMLInputElement oder die Zahl 0. Ausdrücke, die gemischte Typen zurückliefern, sind schlechter Stil, das sollte man meiden. Das `|| 0` wegzulassen ist besser. `undefined` ist zwar auch ein anderer Typ (`undefined` ist der einzige Wert des `undefined` Typs), aber es ist immerhin ein wohldefinierter Wert für „da existiert etwas nicht“. Und wenn man schon zwischen Typen unterscheiden muss, dann mit möglichst wenig Code.*
Lass also diese || 0 Korrektur im Aufruf weg. Du bekommst bei fehlenden Feldern dann `undefined` in die Funktion hinein. Und nun überlege Dir, wie Du damit umgehst, dass in `element` dieser Wert drinsteht.
Eine Variable anzulegen ist jedenfalls nicht nötig. Welche sollte es sein? Und warum überhaupt? Welchen Wert erwartest Du von `getInputAsFloat` denn sinnvollerweise zurück, wenn das input-Element nicht existiert?
Ich hätte aber zu dieser Codezeile noch allgemeine Anmerkungen:
- statt `typeof irgendwas == 'undefined'` kannst Du auch direkt mit der eingebauten Konstanten `undefined` vergleichen. Dabei ist auf das Dreifachgleich zu achten, weil das Doppelgleich versucht, die verglichenen Werte aneinander anzupassen, wenn sie verschiedene Typen haben. Beispielsweise würden Abfragen wie `null == undefined` oder `0 == ""` behaupten, das sei gleich.
~~~js
if (irgendwas === undefined) {
...
}
~~~
- wenn Du genau weißt, dass bei einer Abfrage **entweder** ein Objekt **oder** `undefined` oder `null` vorkommt, dann kannst Du ausnutzen, dass ein Objekt immer truthy ist und die Werte `undefined` und `null` falsy sind (hast Du „Was ist Wahrheit“ gelesen?).
Ein gültiges input-Element wird also als truthy betrachtet. Und damit kannst Du kompakt schreiben:
~~~js
if (element) {
// Element ist da
}
// oder
if ( !element ) {
// Element ist nicht da
}
~~~
Solche Abfragen sind sprachtypisch für JavaScript, davor solltest Du keine Angst haben.
_Rolf_
--
sumpsi - posui - obstruxi