11.112015

Release von NodeJS 5.0.0

NodeJS 5.0.0 ist nun seit einigen Tagen verfügbar. Diesmal gibt es nicht zu viel Neues im aktuellen Major-Release. Dennoch möchte ich in diesem Artikel kurz auf zwei neue Features des Sprachkerns, die die neue v8 Version mit sich bringt verweisen. Neben den offensichtlichen Änderungen in NodeJS 5 im Vergleich zur Version 4 wie etwa npm3 anstatt npm2 sowie Änderungen an TLS, HTTP und kleineren Änderungen an Methoden des FS-Moduls freut mich die folgende Zeile im Changelog:

"v8: (Breaking) Upgraded to 4.6.85.25 from 4.5.103.35".

Diese Änderung beschert uns zwei neue Funktionalitäten, mit denen sich herumspielen lohnt.

new.target

Die Eigenschaft new.target zeigt an, ob eine Funktion oder Konstruktor über das new-Schlüsselwort aufgerufen wurde. Er referenziert die aufgerufene Funktion.

So lässt sich der Boilerplate-Code:

function Foo() {
 if (!this instanceof Foo) {
 return new Foo();
 }
}

folgendermaßen umschreiben:

function Foo() {
 if (!new.target) {
 return new Foo();
 }
}

Sicherlich gibt es noch andere Spezialfälle, in denen es Hilfreich ist, den Konstruktoraufruf zu kennen, aber viel interessanter ist die zweite Änderung, die es in die v8 geschafft hat:

Spread-Operator

Es ist nun möglich Arrays als Teil eines Funktionsaufrufes in ihre Elemente zu zerlegen. So sind die folgenden Aufrufe ab sofort gültiger NodeJS-Code:

var a = [1 , 2 , 3];
var b = [...a, 4];

console.log(...b);
> 1 2 3 4

Mehr Infos zum Spread-Operator und seiner Funktionsweise findet ihr unter anderem auf MDN

Wermutstropfen zur Zeit:

Der Spread-Operator scheint auf aktuellen JS-VMs sehr langsam zu arbeiten. So ist ein apply, welches mit Array Manipulationen ähnliche Funktionalität bereitstellt deutlich fixer. Der aktuelle Chrome-Browser (46.0.2490.71) nutzt die gleiche v8 Version wie NodeJS 5. Somit geben die folgenden Tests einen ersten Eindruck:  http://jsperf.com/es6-spread-vs-apply , http://jsperf.com/es6-spread-vs-apply-concat.

Dennoch lassen sich Operationen, in denen Arrays als Teilargumente genutzt werden deutlich klarer formulieren:

Ein simples Beispiel könnte ein generischer Logger sein:

function SomeClass() {
 this.name = new.target.name;
}
SomeClass.prototype.log = function() { console.log(this.name, ...arguments); }

Ein weiterer Punkt ist, dass Dekonstruktion von Arrays noch nicht unterstützt wird. v8 hat noch keinen Unterstützung für "destruction assignments" wie etwa:

[a, ...b] = [1, 2, 3, 4];

(siehe auch den folgenden MDN Artikel);

Nichts desto trotz wünsche ich viel Spaß mit der neuen Version und hoffe natürlich, dass noch viele weitere coole ES6-Features Einzug  in die v8 finden werden.