Eine Sache, nach der ich mich immer schon sehnte und danach sehnte, war eine Unterstützung für Hashing. Lassen Sie mich insbesondere Metadaten über ein Objekt verfolgen, ohne eine expando-Eigenschaft für dieses Objekt hinzufügen zu müssen..
Java stellt Object.getHashCode()
zur Verfügung, das standardmäßig die zugrunde liegende Speicheradresse verwendet; Python stellt id(obj)
zur Verfügung, um die Speicheradresse zu erhalten und hash(obj)
anpassbar zu sein; etc. Javascript bietet für beides nichts.
Zum Beispiel schreibe ich eine Javascript-Bibliothek, die versucht, einige Objekte, die Sie mir geben, z. B. Ihre <li> Elemente oder sogar etwas ohne Zusammenhang mit dem DOM unauffällig und anmutig zu verbessern. Nehmen wir an, ich muss jedes Objekt genau einmal verarbeiten. Nachdem ich jedes Objekt bearbeitet habe, brauche ich einen Weg, es zu markieren.
Idealerweise konnte ich meine eigene Hash-Tabelle oder einen Satz (oder so, implementiert als ein Wörterbuch) machen den Überblick zu behalten:
var processed = {};
function process(obj) {
var key = obj.getHashCode();
if (processed[key]) {
return; // already seen
}
// process the object...
processed[key] = true;
}
Aber da das nicht eine Option ist, muss ich das Hinzufügen einer Eigenschaft greifen auf jedes Objekt:
var SEEN_PROP = "__seen__";
function process(obj) {
if (obj[SEEN_PROP]) { // or simply obj.__seen__
return; // already seen
}
// process the object...
obj[SEEN_PROP] = true; // or obj.__seen__ = true
}
Aber diese Objekte sind nicht meine, so das macht mein Skript penetrant. Die Technik ist effektiv ein Hack, um die Tatsache zu umgehen, dass ich keinen zuverlässigen Hash-Schlüssel für irgendein beliebiges Objekt bekommen kann. Eine andere Problemumgehung besteht darin, Wrapper-Objekte für alles zu erstellen, aber oft benötigen Sie einen Weg, um vom ursprünglichen Objekt zum Wrapper-Objekt zu gelangen, das sowieso eine expando-Eigenschaft für das ursprüngliche Objekt erfordert. Außerdem wird dadurch ein zirkulärer Verweis erzeugt, der Speicherlecks im IE verursacht, wenn das ursprüngliche Objekt ein DOM-Element ist. Dies ist also keine sichere browserübergreifende Technik.
Für Entwickler von Javascript-Bibliotheken ist dies ein wiederkehrendes Problem.
Sie könnten jslint in Bezug auf Ihren ersten Punkt interessant finden. Keine Compilation, aber Syntaxprüfung –
Ich empfehle das Lesen von Crockfords Buch "Javascript: The Good Parts", das auch die schlechten Teile abdeckt;) –
Ihre Probleme scheinen in der zu erwartenden Unruhe beim Wechsel von einer statisch getippten zu einer dynamischen Sprache zu liegen . Das beste Mittel dafür ist der Unit-Test. Komponententests sind sehr hilfreich in dynamischen Sprachen. –