Professional Documents
Culture Documents
Foi pensando nisso que estruturei esse post para que voc no s
aprenda o que o ES6 mas tambm como tirar proveito dele o mais
rpido possvel.
Classes
Mdulos
. . .
O que
https://medium.com/@matheusml/oguiadoes6tudoquevoc%C3%AAprecisasaber8c287876325f 1/18
2017516 OGuiadoES6:TUDOquevocprecisasaberMatheusLimaMedium
O que
ES6, ECMAScript 6 ou ES2015, simplesmente a mais nova verso do
JavaScript.
Porm nesse post usarei o nome ES6 porque o mais conhecido pela
comunidade.
Objetivos doES6
O TC39 focou em alguns objetivos no desenvolvimento do ES6:
. . .
Como usar
No momento que esse post est sendo escrito, a grande maioria dos
browsers ainda no do suporte ao ES6, ento o que podemos fazer
para contornar essa limitao?
https://medium.com/@matheusml/oguiadoes6tudoquevoc%C3%AAprecisasaber8c287876325f 2/18
2017516 OGuiadoES6:TUDOquevocprecisasaberMatheusLimaMedium
mkdires6
cdes6
touchindex.js.babelrc
npminit
npmsavedevbabelclibabelpresetes2015
1 letnumber=1
2
3 console.log(number)
https://medium.com/@matheusml/oguiadoes6tudoquevoc%C3%AAprecisasaber8c287876325f 3/18
2017516 OGuiadoES6:TUDOquevocprecisasaberMatheusLimaMedium
{
'presets':['es2015']
}
babelindex.jsoscript.js
1 'usestrict';
2
3 varnumber=1;
4 console.log(number);
. . .
https://medium.com/@matheusml/oguiadoes6tudoquevoc%C3%AAprecisasaber8c287876325f 4/18
2017516 OGuiadoES6:TUDOquevocprecisasaberMatheusLimaMedium
Declarao de variveis
Para entender os benefcios da nova forma de se declarar variveis em
ES6 com let e const, precisamos antes entender o conceito de hoisting.
var x let
A diferena principal entre o var e o let que enquanto o primeiro
tem escopo de funo, o segundo possui escopo de bloco:
1 //escopodefunocomvar
2 functiondoSomething(){
3 vara=1;
4 if(true){
5 varb=2;//bdeclaradodentrodoifmasvisvelfora
6 }
7 varc=a+b;//3
8 }
9
10 //escopodeblococomlet
11 functiondoSomethingElse(){
12 leta=1
1 for(vari=0;i<5;i++){/*dosomething*/}
2 for(letj=0;j<5;j++){/*dosomethingelse*/}
3
4 console.log(i);//5
let x const
const funciona de forma semelhante. A nica diferena que as
variveis criadas no podem ser reatribudas:
https://medium.com/@matheusml/oguiadoes6tudoquevoc%C3%AAprecisasaber8c287876325f 5/18
2017516 OGuiadoES6:TUDOquevocprecisasaberMatheusLimaMedium
1 leta=1
2 a=2
3
4 constb=1
1 constobject={
2 property:1
3 }
4
5 object.property=2
Parmetro defunes
Algumas pequenas alteraes foram adicionadas em relao a
parametrizao de funes. Apesar dessas mudanas serem pequenas,
elas trazem enormes benefcios.
default parameters
Os parmetros de funes tem undened como valor default. Porm,
em alguns casos, pode ser necessrio utilizar um outro valor. Com a
verso atual do JavaScript (ES5) ns j podemos fazer isso dessa
forma:
1 varmultiply=function(x,y){
2 y=y|1;
3 returnx*y;
4 };
5
6 multiply(3,2);//6
O ES6 introduziu uma nova forma, bem mais simples, de se fazer isso.
Basta adicionar o valor default na denio do parmetro desejado:
https://medium.com/@matheusml/oguiadoes6tudoquevoc%C3%AAprecisasaber8c287876325f 6/18
2017516 OGuiadoES6:TUDOquevocprecisasaberMatheusLimaMedium
1 constmultiply=(x,y=1)=>{
2 returnx*y
3 }
4
5 multiply(3,2)//6
1 constmultiply=(x,y=1)=>x*y
2
3 multiply(3,2)//6
4 multiply(3)//3
rest parameters
Na verso atual do JavaScript podemos utilizar o objeto arguments
para pegar todos os parmetros de uma funo:
1 varsum=function(){
2 varresult=0;
3 for(vari=0;i<arguments.length;i++){
4 result+=arguments[i];
5 }
6 returnresult;
7 }
1 functionsum(...numbers){
2 letresult=0
3 numbers.forEach((number)=>{
4 result+=number
5 })
6 returnresult
7 }
https://medium.com/@matheusml/oguiadoes6tudoquevoc%C3%AAprecisasaber8c287876325f 7/18
2017516 OGuiadoES6:TUDOquevocprecisasaberMatheusLimaMedium
1 constsum=(...numbers)=>
2 numbers.reduce((acc,current)=>acc+current,0)
3
4 sum(1,2,3,4,5)//15
1 functionsum(start,...numbers){
2 letresult=start;
3 numbers.forEach((number)=>{
4 result+=number;
5 });
6 returnresult;
7 }
Ou ento:
1 constsum=(start,...numbers)=>
2 numbers.reduce((acc,current)=>acc+current,start)
3
4 sum(10,1,2,3,4,5)//25
Programao Funcional
As minhas alteraes preferidas do ES6 esto nessa categoria. Nos
prximos exemplos tentarei mostrar o porqu.
arrow functions
Os arrow functions so um excelente syntax sugar na criao de
funes. Uma funo que seria escrita dessa forma em ES5:
https://medium.com/@matheusml/oguiadoes6tudoquevoc%C3%AAprecisasaber8c287876325f 8/18
2017516 OGuiadoES6:TUDOquevocprecisasaberMatheusLimaMedium
1 varsum=function(x,y){
2 returnx+y;
3 };
4
Pode ser escrita dessa forma em ES6 com o uso das arrow functions:
1 constsum=(x,y)=>{
2 returnx+y
3 }
4
1 constsum=(x,y)=>x+y
2
3 sum(1,2)//3
1 functionWidget(){
2 varbutton=document.getElementById('button');
3 button.addEventListener('click',function(){
4 this.doSomething();//o'this'noapontaparaWidgetcomoesperadoeprovocar
5 });
https://medium.com/@matheusml/oguiadoes6tudoquevoc%C3%AAprecisasaber8c287876325f 9/18
2017516 OGuiadoES6:TUDOquevocprecisasaberMatheusLimaMedium
1 functionWidget(){
2 constbutton=document.getElementById('button')
3 button.addEventListener('click',()=>{
4 this.doSomething()//o'this'apontaparaWidgetenoprovocarnenhumerro.
5 })
destructuring
Uma nova forma de declarar variveis extraindo valores de objetos e
arrays atravs do destructuring. Ela funciona dessa forma:
1 const[a,b]=[1,2]
2
3 console.log(a)//1
4 console.log(b)//2
1 const[a,b,...rest]=[1,2,3,4,5]
2
3 console.log(a)//1
4 console.log(b)//2
1 constperson={name:'Matheus',age:26}
2
3 const{name,age}=person
4
5 console.log(name)//'Matheus'
Provavelmente, o uso mais comum vai ser no import de libs. Vamos ter
o poder de transformar isso:
1 varReactRouter=require('reactrouter');
2 varRoute=ReactRouter.Route;
3 varLink=ReactRouter.Link;
4 varRouter=ReactRouter.Router;
Nisso:
https://medium.com/@matheusml/oguiadoes6tudoquevoc%C3%AAprecisasaber8c287876325f 10/18
2017516 OGuiadoES6:TUDOquevocprecisasaberMatheusLimaMedium
1 const{
2 Route,
3 Link,
4 Router
. . .
Orientao aObjetos
Vamos falar agora sobre a feature mais polmica do ES6: classes.
Classes
Classes nos do uma sintaxe amigvel que denem o estado e o
comportamento de objetos que representam as abstraes que usamos
diariamente.
constructor
Por exemplo, se necessitarmos de uma abstrao para animais em que
cada animal possui um nome, poderamos implementar dessa forma:
https://medium.com/@matheusml/oguiadoes6tudoquevoc%C3%AAprecisasaber8c287876325f 11/18
2017516 OGuiadoES6:TUDOquevocprecisasaberMatheusLimaMedium
1 classAnimal{
2 constructor(name){
3 this._name=name
4 }
5
6 getName(){
7 returnthis._name
8 }
9
10 setName(name){
11 this._name=name
12 }
13 }
getters/setters
Como getters e setters so muito comuns na utilizao de classes, o
ES6 veio com um syntax sugar para lidar com os mesmos. Ento
podemos reescrever o exemplo anterior dessa forma melhorada:
1 classAnimal{
2 constructor(name){
3 this._name=name
4 }
5
6 getname(){
7 returnthis._name
8 }
9
10 setname(name){
11 this._name=name
12 }
13 }
https://medium.com/@matheusml/oguiadoes6tudoquevoc%C3%AAprecisasaber8c287876325f 12/18
2017516 OGuiadoES6:TUDOquevocprecisasaberMatheusLimaMedium
herana
Vamos pensar em um caso em que alm de um nome, um Animal
tambm ter um novo comportamento: emitir um som.
1 classAnimal{
2 constructor(name){
3 this._name=name
4 }
5
6 speak(){
7 console.log(`${this._name}makesanoise`)
8 }
9 }
10
11 classDogextendsAnimal{
12 speak(){
13 console.log(`${this._name}barks`)
14 }
15 }
16
17 classCatextendsAnimal{
18 speak(){
ES6 Classes
. . .
Mdulos
Um dos grandes problemas do JavaScript era no ter um sistema
built-in de mdulos assim como a maioria das linguagens possui.
https://medium.com/@matheusml/oguiadoes6tudoquevoc%C3%AAprecisasaber8c287876325f 13/18
2017516 OGuiadoES6:TUDOquevocprecisasaberMatheusLimaMedium
ES6 Modules
A maioria dos desenvolvedores que j trabalhou em projetos grandes
sabe a importncia dos mdulos: organizar o sistema, aumentar o
reuso e diminuir a complexidade de cada pequeno trecho do seu code
base.
export/import
Exportar mdulos bem simples. Aps criarmos uma funo podemos
simplesmente adicionar a palavra export antes da denio da mesma:
1 //lib.js
2 exportfunctionsum(x,y){
3 returnx+y
4 }
1 import{sum}from'lib'
2
3 sum(1,2)//3
1 //lib.js
2 exportfunctionsum(x,y){
3 returnx+y
4 }
5
6 exportfunctionmult(x,y){
E para importar:
1 import{sum,mult}from'lib'
2
3 sum(1,2)//3
4 mult(1,2)//2
https://medium.com/@matheusml/oguiadoes6tudoquevoc%C3%AAprecisasaber8c287876325f 14/18
2017516 OGuiadoES6:TUDOquevocprecisasaberMatheusLimaMedium
1 import*aslibfrom'lib'
2
3 lib.sum(1,2)//3
4 lib.mult(1,2)//2
classes
Para importar e exportar classes tambm no h muitas mudanas,
basta criar uma classe com o export na frente:
1 //developer.js
2 exportclassDeveloper{
3 constructor(name){
4 this._name=name
5 }
6
7 getname(){
8 returnthis._name
1 import{Developer}from'developer'
2
3 constdev=newDeveloper('Matheus')
4 dev.name//'Matheus'
default
comum termos a necessidade de exportar apenas uma funo/classe
por arquivo. Nesse cenrio podemos utilizar a exportao default:
1 //square.js
2 exportdefaultfunction(x){
3 returnx*x
4 }
Uma das vantagens que o cliente (quem faz o import) que vai setar
o nome do mdulo como bem quiser:
1 importsquarefrom'square'
2
3 square(2)//4
. . .
Caso Real
https://medium.com/@matheusml/oguiadoes6tudoquevoc%C3%AAprecisasaber8c287876325f 15/18
2017516 OGuiadoES6:TUDOquevocprecisasaberMatheusLimaMedium
Caso Real
Para ver um caso real de todas as features citadas acima (exceto
classes) s dar uma lida no projeto open source que estou
trabalhando recentemente, o pareto.js.
. . .
JSCasts
difcil encontrar contedo bom e atualizado em portugus. Com isso
em mente criamos o JSCasts, onde voc vai se manter em dia com o
JavaScript e todo o seu ecossistema de forma fcil e interativa.
Cursos:
https://medium.com/@matheusml/oguiadoes6tudoquevoc%C3%AAprecisasaber8c287876325f 16/18
2017516 OGuiadoES6:TUDOquevocprecisasaberMatheusLimaMedium
https://medium.com/@matheusml/oguiadoes6tudoquevoc%C3%AAprecisasaber8c287876325f 17/18
2017516 OGuiadoES6:TUDOquevocprecisasaberMatheusLimaMedium
https://medium.com/@matheusml/oguiadoes6tudoquevoc%C3%AAprecisasaber8c287876325f 18/18