JavaScript - ES6: let, const, arrow function
Aug 4, 2020Tempo de leitura 2 minA 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