JavaScript 1.8 ist ein Teil von Gecko 1.9 (welches in Firefox 3 integriert ist). Dieses Update ist von geringerer Bedeutung als JavaScript 1.7, beinhaltet jedoch einige Neuerungen, um den Fortschritt bis hin zu ECMAScript 4/JavaScript 2 zu verfolgen. Dieses Release beinhaltet alle neuen Features von JavaScript 1.6 und JavaScript 1.7.
Siehe Bug 380236, um die Weiterentwicklung von JavaScript 1.8 zu verfolgen. Um den akteullen Stand der Dokumentation zu prüfen, siehe Bug 421027.
Einsatz von JavaScript 1.8
Für die Benutzung der Features von JavaScript 1.8 in HTML, geben Sie die Version wie folgt an:
Eine weitere Möglichkeit (nicht zu empfehlen) besteht darin, das veraltete to <script>-Attribut zu verwenden und "JavaScript1.8" anzugeben.
Bei Verwendung der JavaScript-Shell, JavaScript XPCOM Komponenten, oder XUL-<script>-Elementen, wird automatisch die neuste Version (JS1.8 bei Mozilla 1.9) benutzt (Bug 381031, Bug 385159).
Solche Features, welche mit den neuen Schlüsselwörtern "yield" und "let" arbeiten, setzen die Version 1.7 oder höher als Versionsangabe voraus, da bei existierendem Code diese Schlüsselwörter eventuell bereits als Bezeichner für Variablen oder Funktionen verwendet werden. Bei anderen Features, die keine neuen Schlüsselwörter einführen (wie z.B. Generator-Ausdrücke) kann auf die die Versionsangabe verzichtet werden.
Expression Closures (neue Seite erstellen)
Dieses Feature ist schlicht eine Kurzschreibweise für einfache Funktionen, womit der Sprache etwas ähnliches wie Lambda Notation hinzugefügt wird.
JavaScript 1.7 und früher:
function(x) { return x * x; }
JavaScript 1.8:
function(x) x * x
Diese Syntax erlaubt das Weglassen der geschwungenen Klammern und der return-Anweisung - die Blockbegrenzung und die Rückgabe wird also implizit durchgeführt. Abgesehen von der kürzeren Schreibweise hat diese Syntax keinerlei Vorteile gegenüber der Syntax normaler Funktionen.
Beispiele:
Eine Kurzschreibweise für das Anbinden von Event-Listenern:
document.addEventListener("click", function() false, true);
Verwendung der Notation in Kombination mit einigen der Array-Funktionen von JavaScript 1.6:
elems.some(function(elem) elem.type == "text");
Generator-Ausdrücke (siehe Generator-Ausdrücke)
Dieses neue Feature ermöglicht die einfache Erzeugung von Generatoren (die mit JavaScript 1.7 eingeführt wurden). Ohne dieses Feature müsste man zunächst eine benutzerdefinierte Funktion erstellen, welche ein yield enthält. Mit Generator-Ausdrücken ist es jedoch möglich unter Einsatz einer Syntax, ähnlich der von Array Comprehensions, identische Generaor-Anweisungen zu erzeugen.
Bei JavaScript 1.7 würde man den Code zur Erstellung eines benutzerdefinierten Generators vielleicht so schreiben:
function add3(obj) {
for ( let i in obj )
yield i + 3;
}
let it = add3(someObj);
try {
while (true) {
document.write(it.next() + "<br>\n");
}
} catch (err if err instanceof StopIteration) {
document.write("End of record.<br>\n");
}
Bei JavaScript 1.8 kann man das Erstellen der benutzerdefinierten Generator-Funktion umgehen, indem man einen Generator-Ausdruck verwendet:
let it = (i + 3 for (i in someObj));
try {
while (true) {
document.write(it.next() + "<br>\n");
}
} catch (err if err instanceof StopIteration) {
document.write("End of record.<br>\n");
}
Generator-Ausdrücke können auch als Werte an Funktionen übergeben werden. Das ist bemerkenswert, da Generatoren nicht ausgeführt werden, solange sie nicht tatsächlich gebraucht werden (anders als bei Array Comprehensions, wo bereits vor der Übergabe ein Array erzeugt wird). Im Folgenden in Beispiel für die Unterscheide:
Einsatz von JavaScript 1.7 Array Comprehension
handleResults([ i for ( i in obj ) if ( i > 3 ) ]);
function handleResults( results ) {
for ( let i in results )
// ...
}
Einsatz von JavaScript 1.8 Generator-Ausdruck
handleResults( i for ( i in obj ) if ( i > 3 ) );
function handleResults( results ) {
for ( let i in results )
// ...
}
Der signifikante Unterschied besteht darin, dass bei dem Generator-Ausdruck nur einmal über die Elemente iteriert wird, während bei der Array Comprehension zweimal, einmal bei der Erstellung des neuen Arrays durch die Array Comprehension und ein weiteres mal mit der for-Schleife, iteriert wird.
Weitere Extras für Arrays
Zwei neue Array-Methoden wurden hinzugefügt:
reduce()- führt eine Funktion für jedes Element in einem Array aus und sammelt die Ergebnisse von vorherigen Aufrufen.reduceRight()- führt eine Funktion für jedes Element in einem Array aus und sammelt die Ergebnisse von vorherigen Aufrufen in umgekehrter Reihenfolge.
Änderungen bei for..in (Auf diese Änderung sollte in einem neuen Artikel zu des. Assignment hingewiesen werden)
Eine Änderung im Release von JavaScript 1.8 war eine Fehlerkorrektur, die mit dem Extrahieren von Schlüssel-Wert-Paaren aus Arrays über Destructing Assignment zusammenhängt, welches mit JavaScript 1.7 eingeführt wurde. Vorher war es möglich die Schlüssel/Werte eines Arrays mit for ( var [key, value] in array ) zu extrahieren. Dies machte es unmöglich, die Werte eines Arrays zu extrahieren - sofern diese Werte selbst Arrays waren (z. B. wenn ein Iterator ein Array mit dem aktuellen Schlüssel-Wert-Paar zurückgibt). Dieses Problem ist mit der Änderung gelöst (Bug 366941). Man kann jedoch for ( var [key, value] in Iterator(array)) benutzen.