Hallo,
Eine Kontrollausgabe ergab, das tatsächlich (in einem Beispiel) zwar 49 Zeichen als Länge des Strings ausgegeben wurden, aber trotzdem die Bedingung "<5 Zeichen" ignoriert wurde.
Das ist genau mein Problem: Die Kontroll-Ausgabe belegt, dass die Bedingung erfüllt ist, und trotzdem scheint JavaScript zur Else-Abzweigung zu wechseln.
Jahaaa, weil Kontrollausgaben mit alert() das Selection-Objekt automatisch in einem String umwandeln, indem sie toString() aufrufen!
So funktioniert JavaScript: Wenn der Kontext einen einfachen Wert (Primitive) erwartet, dann wird das Objekt in einen solchen umgewandelt. Dabei wird automatisch toString() aufgerufen, falls diese Methode existiert (wenn nicht, wird valueOf() probiert).
Das kann man mit einem einfachen Objekt testen:
var smiley = {
toString: function() {
return ":-)";
}
};
alert(smiley); // :-)
console.log(smiley); // Je nach Browser eine interaktive Repräsentation wie
// ▶ Object {toString: function}, oder [object Object],
// aber :-) wäre auch möglich
Mit alert() und ähnlichem muss du also vorsichtig sein. Auch bei Operatoren, die Primitive-Operanden erwarten:
console.log("The smiley object: " + smiley); // :-)
Hier wird automatisch in String umgewandelt, weil der Operand links vom Operator ein String ist.
Eigentlich ist das ein nützliches Feature von JavaScript, aber beim Debuggen muss man vorsichtig sein. Sofern man die Konsole-API (console.log und Freunde) verwendet, ist man in neueren Browsern eigentlich sicher. alert() eignet sich aus verschiedenen Gründen nicht gut zum Inspizieren von JavaScript-Werten.
Wen die ECMAScript-Interna interessieren:
ToString
ToPrimitive
[[DefaultValue]] (hint)
Ferner:
http://www.2ality.com/2012/03/converting-to-string.html
http://www.2ality.com/2011/03/javascript-values-not-everything-is.html
Mathias