voltar aos artigosadvanced topics
$cd~/artigos/modern-javascript-syntax-es6-sintaxe-moderna
Advanced Topics
série 33 Conceitos JS·parte 33 de 38

Modern JS Syntax (ES6+): O JavaScript que Você Realmente Usa

24 minVanderlei José Alamino

"ES6 não adicionou apenas recursos. Transformou como escrevemos JavaScript. O código de hoje parece uma linguagem diferente do código de 2014."

Desde o ECMAScript 2015 (ES6), JavaScript ganhou sintaxe que você usa todo dia: const, arrow functions, destructuring, spread, template literals, ?. e ??.

snippetJavaScript
const user = { name: 'Alice', prefs: { theme: 'dark' } };const theme = user?.prefs?.theme ?? 'light';const greet = (name = 'Guest') => `Hello, ${name}!`;

Neste guia da série 33 Conceitos JS — projeto open source criado por Leonardo Maldonado — você consolida os recursos ES6+ que definem o JS moderno.

Pré-requisitos: Scope and Closures (let/const) e this, call, apply & bind — essencial para entender arrow functions.

modern-javascript-syntax-es6-sintaxe-moderna.meta.jsonjson

// metadados do artigo

{
  "tag": "advanced topics",
  "readTime": "24 min",
  "author": "Vanderlei José Alamino",
  "source": "33jsconcepts.com",
  "series": "33 Conceitos JS",
  "part": {
    "current": 33,
    "total": 38
  }
}
abrir fonte original
modern-javascript-syntax-es6-sintaxe-moderna.mdmarkdown

Fonte de referência

Conteúdo adaptado a partir do guia original em inglês.

33jsconcepts.com
01

seção

let, const e var — Resumo

varletconst
EscopoFunçãoBlocoBloco
HoistingSim (undefined)TDZTDZ
RedeclararSimErroErro
snippetJavaScript
for (var i = 0; i < 3; i++) setTimeout(() => console.log(i), 100);// 3, 3, 3 for (let i = 0; i < 3; i++) setTimeout(() => console.log(i), 100);// 0, 1, 2

Regra moderna: const por padrão, let se reatribuir, evite var. Detalhes em Scope and Closures.

02

seção

Arrow Functions

snippetJavaScript
const add = (a, b) => a + b;const square = x => x * x;const greet = () => 'Hello!';

Diferença crítica: arrow functions não têm this, arguments, super ou new.target próprios — herdam do escopo léxico.

snippetJavaScript
const counter = {  count: 0,  start() {    setInterval(() => {      this.count++;  // this = counter    }, 1000);  },};

Quando NÃO usar

  • Métodos de objeto — this não é o objeto
  • Construtores — new ArrowFn() → TypeError
  • Precisa de arguments — use rest ...args

Armadilha: retornar objeto

snippetJavaScript
const createUser = name => ({ name, active: true });  // ✓ parêntesesconst bad = name => { name: name };  // ✗ undefined (bloco, não objeto)
03

seção

Destructuring

Array — por posição:

snippetJavaScript
const [first, , third] = ['red', 'green', 'blue'];const [head, ...tail] = colors;let x = 1, y = 2;[x, y] = [y, x];  // troca sem temp

Object — por nome de propriedade:

snippetJavaScript
const { name, age = 18 } = user;const { name: userName } = user;const { address: { city } } = user;const { id, ...rest } = obj;

Parâmetros de função:

snippetJavaScript
function createUser({ name, age = 18, role = 'user' } = {}) {  return { name, age, role };}

Erro comum: { name } = user → SyntaxError. Use ({ name } = user).

04

seção

Spread e Rest

ContextoNomeAção
Chamada, array/objeto literalSpreadExpande
Parâmetro, destructuringRestColeta
snippetJavaScript
const combined = [...arr1, ...arr2];const settings = { ...defaults, ...userPrefs };function sum(...nums) { return nums.reduce((a, b) => a + b, 0); }Math.max(...arr);

Cópia rasa: spread copia só o primeiro nível. Aninhados ainda compartilham referência — use structuredClone() para deep copy.

05

seção

Template Literals

snippetJavaScript
const msg = `Hello, ${name}! You are ${age} years old.`;const total = `Total: $${(price * (1 + tax)).toFixed(2)}`;

Backticks permitem multiline sem concatenação de \n.

Tagged templates — função processa partes e valores:

snippetJavaScript
function highlight(strings, ...values) {  return strings.reduce((acc, s, i) => acc + s + (values[i] ?? ''), '');}

Base de styled-components, GraphQL builders, etc.

06

seção

Optional Chaining (?.)

snippetJavaScript
const city = user?.address?.city;       // propriedadeconst val = user?.[dynamicKey];          // bracketconst result = obj.method?.();           // chamada

Para em null/undefined — retorna undefined sem TypeError.

snippetJavaScript
// ✓ quando null é válidoconst name = apiResponse?.data?.user?.displayName ?? 'Anonymous'; // ✗ esconde bug se user é obrigatóriofunction process(user) { return user?.name?.toUpperCase(); }
07

seção

Nullish Coalescing (??)

Valor`\\`??
null / undefineddefaultdefault
0, '', falsedefaultmantém
snippetJavaScript
const count = response.count ?? 10;  // 0 permanece 0const port = process.env.PORT ?? 3000;

Atribuição lógica (ES2021):

snippetJavaScript
options.retries ??= 3;options.debug ||= false;user.lastLogin &&= new Date();

Combine com ?.: user?.address?.city ?? 'Unknown'.

08

seção

Parâmetros Padrão

snippetJavaScript
function greet(name = 'Guest', greeting = 'Hello') {  return `${greeting}, ${name}!`;}

Disparam só com undefined — null, 0, '' e false não ativam default.

Defaults podem referenciar parâmetros anteriores: function rect(w, h = w) { ... }.

Expressões como Date.now() rodam a cada chamada, não na definição.

09

seção

Enhanced Object Literals

snippetJavaScript
const user = { name, age };           // property shorthandconst calc = { add(a, b) { return a + b; } };  // method shorthandconst obj = { [dynamicKey]: value };  // computed keys

Shorthand reduz { name: name } → { name }. Métodos async funcionam igual.

10

seção

Map, Set e Symbol

Map — chaves de qualquer tipo, ordem de inserção, .size:

snippetJavaScript
const map = new Map([['a', 1], [objKey, 2]]);map.set(key, value).get(key).has(key);for (const [k, v] of map) { ... }

Set — valores únicos:

snippetJavaScript
const unique = [...new Set([1, 2, 2, 3])];  // [1, 2, 3]

Symbol — identificador único, chaves ocultas de Object.keys:

snippetJavaScript
const ID = Symbol('id');const user = { name: 'Alice', [ID]: 12345 };

Use Map quando chaves não são strings ou precisa de .size/performance. Object para JSON e records simples.

11

seção

for...of vs for...in

snippetJavaScript
for (const color of colors) { }     // valores (iterables)for (const index in arr) { }      // chaves (strings!)
for...offor...in
IteraValoresPropriedades/chaves
Arrays✓ valoresíndices como string

Prefira for...of em arrays, strings, Map, Set. Combine com destructuring: for (const { name } of users).

12

seção

Perguntas Clássicas de Entrevista

13

seção

Teste Seu Conhecimento

$ summary --quick

Resumo rápido

  • const default, let se reatribuir, evite var
  • Arrow functions — herdam this; não use como método/construtor
  • Destructuring — array por posição, object por prop; ({ x } = obj)
  • Spread expande, rest coleta — mesma sintaxe ...
  • ?? só null/undefined; || qualquer falsy
  • ?. — acesso seguro; não esconda bugs obrigatórios
  • Template literals — ${expr} e multiline
  • Defaults — só disparam com undefined
  • Map/Set/Symbol — estruturas ES6 além de Object/Array
  • for...of valores; for...in chaves

Créditos da série

Este artigo faz parte de uma série de estudos inspirada no projeto 33 Conceitos JS, criado por Leonardo Maldonado. Todo o conteúdo original está disponível em 33jsconcepts.com.