JavaScript - ES6: let, const, arrow function

26/02/2016

A nova versão do JavaScript, conhecida também como ECMAScript 6 ou apenas ES6, vamos falar sobre let, const e arrow function.

Let

Declara uma variável local no escopo do bloco atual, opcionalmente iniciando-a com um valor. O let é o substituto para var, pois ele será descontinuado futuramente. Por que ele se comporta como o esperado de uma variável.

Exemplo usando var:

nome = "Airton";
var nome; 
console.log(nome); // Airton

Se fizermos o mesmo, substituindo por let, o que vai acontecer:

nome = "Airton";
let nome; 
console.log(nome); // undefined

Vai dar erro, pois o let suporta somente o modo estrito, o famoso 'use strict', a blz então só adicionar no começo do arquivo:

'use strict';
nome = "Airton";
let nome; 
console.log(nome); // undefined

Também não vai funcionar :disappointed: , pois o let obriga você a sempre declarar as variáveis antes de ser chamada, então como que vai ficar?

'use strict';
let nome;
nome = "Airton"; 
console.log(nome); // Airton

Você pode ver aqui sobre Hoisting para entender melhor isso.

Const

Como o próprio nome diz são constantes, então:

  • O valor de uma constante não pode ser alterado;
  • É obrigatório que um valor seja atribuido à constante em sua declaração;
  • Uma constante não deve compartilhar o nome com uma função ou variável em um mesmo escopo.

Isso quer dizer que uma vez declarada você não consegue mais alterar o valor dela, certo? sim esse é o propósito, mas existe uma marotagem para poder alterar esse valor.

Então se você declarar uma const, ex:

    const nome = "Airton";

O valor da const nome nesse exemplo sempre vai ser Airton, agora se você tentar redeclarar ela com outro valor, o que acontece?

const nome = "Airton";
const nome = "Junior";

Isso vai dar erro dizendo que essa const já foi declarada:

TypeError: Identifier 'nome' has already been declared

E se eu tentar reescrever assim:

const nome = "Airton";
      nome = "Junior";
console.log(nome); // Airton

Não vai dar erro, mas quando você for imprimir a const nome ele vai imprimir Airton.

Const também funciona com objetos:

const user = {name: 'Airton'};
console.log(user); // { name: 'Airton' }

Entretanto, atributos de objetos não estão protegidos, logo a seguinte instrução é executada sem problemas:

const user = {name: 'Airton'};
      user.name = 'Junior';
console.log(user); // { name: 'Junior' }

Arrow Function

É uma função que possui uma sintaxe mais curta, e elas sempre são funções anônimas (IIFE), vinculando o valor de this de maneira léxica, quando ela é criada o valor de this sempre será o mesmo.

// Função normal
function (name) { return name; }

// Arrow Function
(name) => name;

Função nomeada não é possível fazer com arrow function:

// Função normal
function sayName(name) { return name; }

// Arrow Function
sayName(name) => name; // <-- ISSO NÃO EXISTE

O que fazer então? vamos estanciar ela como uma constante:

// Arrow Function
const sayName = (name) => name; // Ae agora sim

Vamos ver um exemplo de uma função que retorna a média de dois números:

// ES5
const media = (function(num1,num2) {
    return (num1 + num2) / 2;
})(10,50); // passando os valores 10  e 50 como parâmetros

console.log(media); // 30

// --------------------------------

// ES6
const media = ((num1,num2) => {
    return (num1 + num2) / 2;
})(10,50);

console.log(media); // 30

// OU MAIS SIMPLES

const media = ( (num1,num2) => (num1 + num2) / 2 )(10,50);
console.log(media); // 30