Node.js v6 suporta praticamente toda a especificação ES6/ES2015

Com o release da 6ª versão do Node.js podemos contar com o suporte de praticamente toda especificação ES6/ES2015! Além de diversas mudanças notáveis, a versão 6 conta com a atualização do V8 para a versão 5.0, o que nos deixa com incríveis 93% de suporte para as features ES6/ES2015. Note que essa atualização inclui praticamente todas features realmente úteis para os desenvolvedores, já que o V8 (assim como outras implementações) tendem a priorizar o que é mais importante/relevante.

A versão 6 já é a versão atual e pode ser baixada agora mesmo! Se você usa o nvm, o upgrade pode ser feito via linha de comando: bash nvm install v6

Sintaxe ES6/ES2015

Vamos ver algumas das features introduzidas com a versão 6:

default parameters

Nos permite inicializar parâmetros com valores padrão, caso nenhum valor tenha sido especificado, ou caso o valor seja undefined.

(function braziljs( date = '26 e 27 de Agosto',                     city = 'Porto Alegre' ) {   console.log(`BrazilJS Conf, ${date}, ${city}`); }()); 

Veja mais sobre default parameters.

RegExp flags "y" e "u"

A RegExp /y, também chamada de sticky, busca apenas a partir do índice indicado pela propriedade lastIndex da expressão regular na string.

// Exemplo retirado da MDN var str = '#foo#'; var regex = /foo/y; regex.lastIndex = 1; regex.test(str); // true regex.lastIndex = 5; regex.test(str); // false (lastIndex é levado em conta com a flag /y) regex.lastIndex; // 0 

A RefExp /u (unicode) lida com pares substitutos (tais como \uD83D\uDE80) como code points e permite que você use code points escapes Unicode (como o \u{1F680}) em expressões regulares.

"𠮷".match(/^.$/u)[0].length === 2; 

Leia mais: http://www.2ality.com/2015/07/regexp-es6.html https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp/sticky http://stackoverflow.com/questions/4542304/what-does-regex-flag-y-do

PS: Para realmente entender Unicode na ES6/ES2015 (eu não entendi :/), leia o artigo do Mathias Bynens: https://mathiasbynens.be/notes/es6-unicode-regex

Destructuring

É uma expressão JavaScript que torna possível extrair dados de qualquer objeto que seja iterável e coloca-los em outras variáveis.

// Arrays var [event, year] = ['BrazilJS', 2016] console.log(event); // BrazilJS console.log(year); // 2016 Arrays var braziljs = ["BrazilJS", "26 e 27 de Agosto", "Porto Alegre"]; var [event, date, city] = braziljs;  console.log(event); // "BrazilJS"  console.log(date); // "26 e 27 de Agosto"  console.log(city); // "Porto Alegre"  // Objetos  var event = { name: 'BrazilJS', date: '26 e 27 de Agosto' };  var { name, date } = event; console.log(name); // BrazilJS  console.log(date); // 26 e 27 de Agosto  // Generator function* informacoes() {   yield "BrazilJS";   yield "26 e 27 de Agosto";   yield "Porto Alegre"; } var [event, date] = informacoes(); console.log(event); // BrazilJS console.log(date); // 26 e 27 de Agosto  Veja mais sobre Destructuring. let O let já era suportado, porém somente em strict-mode. A partir da versão 6 já é possível usar o let a qualquer momento. O let declara uma variável em um escopo por bloco. (function() { if(!braziljs) { let event = 'BrazilJS'; console.log(event); // BrazilJS } console.log(event); // event não existe }());  Vale lembrar que as semânticas do let em modo "sloppy" são diferentes, então o recomendado ainda é usar ele em strict-mode. Veja mais sobre o let. class o suporte ao uso do class somente era possível em outras versões utilizando a flag --harmony. A partir da versão 6 o uso de classes pode ser feito a qualquer momento. breathe () { console.log(`${this.name} is breathing`); } } class Dog extends Animal { constructor(name) { super(name); } bark() { console.log("Woof! Woof! " + this.name + ' is barking'); } } let dog = new Dog('Costelinha'); dog.breathe(); // Costelinha is breathing dog.bark(); // Woof! Woof! Costelinha is barking // Exemplo original em: https://github.com/jaydson/js-future-in-the-present  Leia mais sobre classes. Proxy Proxy é um objeto usado para definir um comportamento customizado para operações. var handler = { get: function (target, name) { console.log(`Pegando ${name}`); } }; var event = new Proxy({}, handler); event.name = 'BrazilJS'; var n = event.name; // Pegando name  Saiba mais sobre Proxy. Reflect É um objeto que fornece métodos para operações que podem ser capturadas. var obj = { name: "BrazilJS" }; var name = Reflect.get(obj, "name"); console.log(name); //BrazilJS  Saiba mais sobre Reflect. Sobre módulos Mas e a sintaxe de módulos ES6/ES2015? Nem o V8 e nem o Node.js ainda possuem suporte a módulos ES6/ES2015. Essa parte não é tão fácil de ser implementada e precisa de um estudo maior, que é o que está acontecendo no momento. Existem issues abertas no projeto node-eps, que é um repositório para discussões sobre possíveis funcionalidades futuras do Node.js. Além disso, existe uma proposta bem sólida, elaborada por Dave Herman, Yehuda Katz e Caridy Patiño, para solucionar o uso de módulos ES6/ES2015 no ambiente Node.js. Saiba mais sobre módulos. Conclusão Ainda existem muitas outras features ES6/ES2015 não cobertas neste artigo, mas é possível notar que o suporte no Node.js está quase completo. É muito bom ver a evolução da plataforma e ver como o projeto está maduro e caminhando para um futuro cada vez mais promissor.