Als Web-Entwickler ist man es ja gewohnt, beim Programmieren mit JavaScript regelmäßig über Unzulänglichkeiten in den Implementierungen der einzelnen Browser zu stolpern. Da ich mich in der letzten Zeit jedoch näher mit JavaScript beschäftigen musste, stellte ich weitere Ungereimtheiten fest, je tiefer ich mich in die Materie einarbeitete und meine Erfahrungen mit dem “JavaScript way of programming” machte.
In diesem Beitrag beschreibe ich die für mich drei größten Überraschungen. Besonders interessant dürfte für die meisten Punkt 3 sein, indem ich meine effiziente Lösung für eine str_replace wie in php für JavaScript vorstelle.
Doch der Reihe nach — aber ihr dürft natürlich auch direkt weiter scrollen ;-)
1. Semikolons am Befehlsende sind optional. Und alles was optional ist, macht in der Regel Probleme. In C, php, Java usw. fliegt einem der Compiler bei einem vergessenem Semikolon um die Ohren; man merkt, dass etwas nicht stimmt, und kann den Fehler schnell beheben. Nicht so in JavaScript, denn hier ist das Semikolon am Befehlsende optional, man kann auch einfach eine neue Zeile einfügen. Dumm nur, dass dadurch ungewünschte Effekte auftreten können. Es gibt Situationen – und das leider öfter, als man denkt! – da vergisst man ein Semikolon, und das was JavaScript dann dort reininterpretiert unterscheidet sich von dem, was man sich vorgestellt hatte. Ups! Abhilfe schaffen hier Tools wie jsLint.
2. Variablen in Funktionen und Objekten sind global. Jedenfalls solange man nicht var vor sie schreibt. Das kann übel sein, wenn man beispielsweise in zwei Funktionen die selben Variablennamen – bspw. i für eine Zählvariable – verwendet, und diese abwechselnd aufruft.
3. str_replace für JavaScript. String-Objekte in JavaScript besitzen zwar eine replace-Methode, die jedoch mit regulären Ausdrücken arbeitet und das Objekt modifiziert. Da ich jedoch nur eine simple Suchen/Ersetzen-Funktion benötige und die Einfachheit der str_replace(search, replace, subject)-Funktion aus php gewöhnt bin, wollte ich mir so etwas für JavaScript basteln, nachdem ich dies auch schon für foreach und in_array getan hatte. Zuerst wollte ich einen Wrapper für String.replace bauen, dann kam mir jedoch eine viel simplere Idee:
function str_replace(search, replace, subject) {
return subject.split(search).join(replace);
}
Der String subject wird an allen Vorkommen von search zerteilt, es entsteht ein Array mit den resultierenden Teil-Strings. Dieses Array wird dann wieder zu einem String verkettet, und zwar mit replace an allen Verknüpfungspunkten.