Capítulo 1: O que é JavaScript?
JavaScript é uma linguagem de programação de alto nível, interpretada e dinamicamente tipada. Criada em 1995 por Brendan Eich na Netscape, JavaScript se tornou essencial para o desenvolvimento web moderno. Ela permite criar páginas dinâmicas, interativas e responsivas, sendo executada diretamente no navegador do usuário através do motor JavaScript (V8 no Chrome, SpiderMonkey no Firefox).
Com JavaScript, é possível manipular elementos da página em tempo real, responder a eventos do usuário, fazer requisições assíncronas, criar animações complexas e até mesmo desenvolver aplicações completas no frontend e backend (Node.js).
JavaScript é uma linguagem de programação que torna sites dinâmicos e interativos.
Exemplo Básico
Primeiro contato com JavaScript:
<button onclick="alert('Olá, JavaScript!')">Clique aqui</button>
// Ou usando JavaScript moderno:
document.querySelector('button').addEventListener('click', () => {
alert('Olá, JavaScript!');
});
Capítulo 2: Variáveis e Tipos de Dados
Variáveis são containers que armazenam valores que podem ser usados e modificados ao longo do código. Em JavaScript moderno, usamos let
(variável mutável), const
(constante) ou var
(escopo de função, não recomendado).
JavaScript é dinamicamente tipado, mas possui os seguintes tipos primitivos: string (texto), number (números inteiros e decimais), boolean (true/false), null (ausência intencional de valor), undefined (valor não definido), symbol (identificador único) e bigint (números grandes).
Tipos de referência incluem: object (objetos), array (listas), function (funções) e date (datas).
Variáveis guardam valores. Tipos: primitivos (string, number, boolean) e de referência (object, array).
Exemplos Detalhados
// Declaração de variáveis
let nome = "Ana Silva";
const idade = 25;
let salario = 3500.50;
let ativo = true;
let endereco = null;
let telefone; // undefined
// Arrays (listas)
let frutas = ["maçã", "banana", "laranja"];
let numeros = [1, 2, 3, 4, 5];
// Objetos
let pessoa = {
nome: "João",
idade: 30,
profissao: "Desenvolvedor",
endereco: {
rua: "Rua das Flores",
cidade: "São Paulo"
}
};
// Verificando tipos
console.log(typeof nome); // "string"
console.log(typeof idade); // "number"
console.log(Array.isArray(frutas)); // true
Capítulo 3: Funções em JavaScript
Funções são blocos de código reutilizáveis que executam uma tarefa específica. Elas podem receber parâmetros (argumentos) e retornar valores. Em JavaScript, funções são objetos de primeira classe, podendo ser atribuídas a variáveis, passadas como argumentos e retornadas por outras funções.
Existem várias formas de declarar funções: Function Declaration (declaração tradicional), Function Expression (expressão de função), Arrow Function (função seta, ES6+), IIFE (Immediately Invoked Function Expression) e Generator Functions (funções geradoras).
Funções executam tarefas e podem ser reutilizadas. Múltiplas formas de declaração.
Diferentes Formas de Funções
// 1. Function Declaration
function somar(a, b) {
return a + b;
}
// 2. Function Expression
const multiplicar = function(a, b) {
return a * b;
};
// 3. Arrow Function (ES6+)
const dividir = (a, b) => a / b;
// 4. Arrow Function com múltiplas linhas
const calcularArea = (base, altura) => {
const area = base * altura;
return area;
};
// 5. Função com parâmetros padrão
const saudar = (nome = "Visitante") => {
return `Olá, ${nome}!`;
};
// 6. Função com rest parameters
const somarTodos = (...numeros) => {
return numeros.reduce((total, num) => total + num, 0);
};
// 7. IIFE (Immediately Invoked Function Expression)
(function() {
console.log("Executada imediatamente!");
})();
// Uso das funções
console.log(somar(5, 3)); // 8
console.log(multiplicar(4, 6)); // 24
console.log(dividir(10, 2)); // 5
console.log(saudar("Maria")); // "Olá, Maria!"
console.log(somarTodos(1, 2, 3, 4, 5)); // 15
Capítulo 4: Arrays e Métodos
Arrays são estruturas de dados que armazenam múltiplos valores em uma única variável. Em JavaScript, arrays são objetos especiais com propriedades e métodos úteis para manipulação de dados.
Métodos importantes incluem: push/pop (adicionar/remover do final), unshift/shift (adicionar/remover do início), splice (modificar array), slice (extrair parte), map (transformar elementos), filter (filtrar elementos), reduce (reduzir a um valor), find/findIndex (encontrar elementos), sort (ordenar) e forEach (iterar).
Arrays são listas de valores. Métodos como map, filter, reduce para manipulação.
Manipulação de Arrays
// Criando arrays
let frutas = ["maçã", "banana", "laranja"];
let numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// Métodos básicos
frutas.push("uva"); // Adiciona no final
frutas.unshift("morango"); // Adiciona no início
frutas.pop(); // Remove do final
frutas.shift(); // Remove do início
// Métodos de transformação
const numerosDobrados = numeros.map(num => num * 2);
const numerosPares = numeros.filter(num => num % 2 === 0);
const somaTotal = numeros.reduce((total, num) => total + num, 0);
// Encontrar elementos
const primeiroPar = numeros.find(num => num % 2 === 0);
const indiceDoCinco = numeros.findIndex(num => num === 5);
// Ordenação
const frutasOrdenadas = frutas.sort();
const numerosOrdenados = numeros.sort((a, b) => a - b);
// Iteração
frutas.forEach((fruta, index) => {
console.log(`${index + 1}: ${fruta}`);
});
// Spread operator
const array1 = [1, 2, 3];
const array2 = [4, 5, 6];
const arrayCombinado = [...array1, ...array2];
// Destructuring
const [primeiro, segundo, ...resto] = numeros;
console.log("Números dobrados:", numerosDobrados);
console.log("Números pares:", numerosPares);
console.log("Soma total:", somaTotal);
console.log("Primeiro par:", primeiroPar);
console.log("Array combinado:", arrayCombinado);
Capítulo 5: Objetos e Classes
Objetos são estruturas de dados que armazenam pares chave-valor. Em JavaScript, objetos são a base para programação orientada a objetos. Classes (ES6+) são templates para criar objetos, oferecendo uma sintaxe mais clara para herança e encapsulamento.
Conceitos importantes: propriedades (dados do objeto), métodos (funções do objeto), construtor (função que cria objetos), herança (extends), encapsulamento (private fields), polimorfismo (múltiplas formas) e getters/setters (acesso controlado).
Objetos são pares chave-valor. Classes são templates para criar objetos.
Objetos e Classes
// Objeto literal
const pessoa = {
nome: "João",
idade: 30,
saudar() {
return `Olá, sou ${this.nome}`;
}
};
// Factory Function
function criarPessoa(nome, idade) {
return {
nome,
idade,
saudar() {
return `Olá, sou ${this.nome}`;
}
};
}
// Constructor Function
function Pessoa(nome, idade) {
this.nome = nome;
this.idade = idade;
this.saudar = function() {
return `Olá, sou ${this.nome}`;
};
}
// Classe (ES6+)
class Funcionario {
#salario; // Campo privado
constructor(nome, cargo, salario) {
this.nome = nome;
this.cargo = cargo;
this.#salario = salario;
}
// Getter
get salario() {
return this.#salario;
}
// Setter
set salario(novoSalario) {
if (novoSalario > 0) {
this.#salario = novoSalario;
}
}
trabalhar() {
return `${this.nome} está trabalhando como ${this.cargo}`;
}
static criarFuncionario(dados) {
return new Funcionario(dados.nome, dados.cargo, dados.salario);
}
}
// Herança
class Gerente extends Funcionario {
constructor(nome, salario, departamento) {
super(nome, "Gerente", salario);
this.departamento = departamento;
}
gerenciar() {
return `${this.nome} está gerenciando o ${this.departamento}`;
}
}
// Uso
const joao = new Funcionario("João", "Desenvolvedor", 5000);
const maria = new Gerente("Maria", 8000, "TI");
console.log(joao.trabalhar());
console.log(maria.gerenciar());
console.log(joao.salario); // Getter
joao.salario = 5500; // Setter
Capítulo 6: Manipulação do DOM
O DOM (Document Object Model) é uma representação em árvore da estrutura HTML da página. JavaScript permite acessar e modificar elementos do DOM para criar páginas dinâmicas e interativas.
Métodos de seleção: getElementById, getElementsByClassName, getElementsByTagName, querySelector, querySelectorAll. Manipulação: innerHTML, textContent, setAttribute, classList, style, createElement, appendChild, removeChild.
DOM representa a página HTML. JavaScript pode modificar elementos em tempo real.
Manipulação do DOM
// Seleção de elementos
const elemento = document.getElementById('meuId');
const elementos = document.getElementsByClassName('minhaClasse');
const primeiro = document.querySelector('.minhaClasse');
const todos = document.querySelectorAll('.minhaClasse');
// Modificando conteúdo
elemento.innerHTML = '<strong>Novo conteúdo</strong>';
elemento.textContent = 'Texto simples';
elemento.setAttribute('class', 'novaClasse');
// Manipulando classes
elemento.classList.add('classeNova');
elemento.classList.remove('classeAntiga');
elemento.classList.toggle('classeAlternada');
// Modificando estilos
elemento.style.backgroundColor = '#ff0000';
elemento.style.fontSize = '18px';
// Criando elementos
const novoElemento = document.createElement('div');
novoElemento.textContent = 'Elemento criado dinamicamente';
novoElemento.className = 'elementoNovo';
// Adicionando ao DOM
document.body.appendChild(novoElemento);
elemento.appendChild(novoElemento);
// Removendo elementos
elemento.removeChild(novoElemento);
novoElemento.remove();
// Exemplo prático
document.getElementById('demoBtn').addEventListener('click', function() {
const area = document.getElementById('demoArea');
const hora = new Date().toLocaleTimeString();
area.innerHTML = `
<h4>Demonstração DOM</h4>
<p>Hora atual: ${hora}</p>
<button onclick="this.style.background='#ff6b6b'">
Mudar Cor
</button>
`;
});
Capítulo 7: Eventos
Eventos são ações que ocorrem na página, como cliques, teclas pressionadas, carregamento de página ou mudanças em formulários. JavaScript permite reagir a esses eventos para criar interatividade.
Tipos de eventos: Mouse (click, dblclick, mouseover, mouseout), Teclado (keydown, keyup, keypress), Formulário (submit, change, input, focus, blur), Documento (load, DOMContentLoaded, resize, scroll), Touch (touchstart, touchmove, touchend).
Eventos permitem responder a ações do usuário. Múltiplos tipos: mouse, teclado, formulário.
Exemplos de Eventos
Área de demonstração de eventos
// Eventos de mouse
elemento.addEventListener('click', function(e) {
console.log('Clique detectado!');
console.log('Coordenadas:', e.clientX, e.clientY);
});
elemento.addEventListener('mouseover', function() {
this.style.backgroundColor = '#ff6b6b';
});
elemento.addEventListener('mouseout', function() {
this.style.backgroundColor = '#6fa3ef';
});
// Eventos de teclado
document.addEventListener('keydown', function(e) {
console.log('Tecla pressionada:', e.key);
console.log('Código da tecla:', e.code);
if (e.key === 'Escape') {
console.log('Escape pressionado!');
}
});
// Eventos de formulário
const input = document.querySelector('input');
input.addEventListener('input', function(e) {
console.log('Valor digitado:', e.target.value);
});
input.addEventListener('focus', function() {
this.style.borderColor = '#6fa3ef';
});
input.addEventListener('blur', function() {
this.style.borderColor = '#ccc';
});
// Evento de carregamento
document.addEventListener('DOMContentLoaded', function() {
console.log('DOM carregado!');
});
// Removendo eventos
const handler = function() { console.log('Evento!'); };
elemento.addEventListener('click', handler);
elemento.removeEventListener('click', handler);
// Event delegation
document.addEventListener('click', function(e) {
if (e.target.matches('.botao')) {
console.log('Botão clicado via delegation');
}
});
Capítulo 8: Promises e Async/Await
Promises são objetos que representam a eventual conclusão (ou falha) de uma operação assíncrona. Async/Await é uma sintaxe mais limpa para trabalhar com promises, tornando o código assíncrono mais legível.
Estados de uma Promise: pending (pendente), fulfilled (resolvida), rejected (rejeitada). Métodos: then (sucesso), catch (erro), finally (sempre executado), Promise.all (múltiplas promises), Promise.race (primeira a resolver).
Promises lidam com operações assíncronas. Async/await torna o código mais limpo.
Promises e Async/Await
// Criando uma Promise
function simularRequisicao(dados, tempo = 1000) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() > 0.1) { // 90% de sucesso
resolve(`Dados recebidos: ${dados}`);
} else {
reject('Erro na requisição');
}
}, tempo);
});
}
// Usando .then() e .catch()
simularRequisicao('usuário123')
.then(resultado => {
console.log('Sucesso:', resultado);
return simularRequisicao('detalhes');
})
.then(resultado => {
console.log('Segunda requisição:', resultado);
})
.catch(erro => {
console.error('Erro:', erro);
})
.finally(() => {
console.log('Operação finalizada');
});
// Usando async/await
async function buscarDados() {
try {
const resultado1 = await simularRequisicao('primeiro');
console.log(resultado1);
const resultado2 = await simularRequisicao('segundo');
console.log(resultado2);
return 'Todos os dados carregados';
} catch (erro) {
console.error('Erro:', erro);
throw erro;
}
}
// Promise.all - executar múltiplas promises
async function carregarTudo() {
try {
const promises = [
simularRequisicao('dados1', 1000),
simularRequisicao('dados2', 1500),
simularRequisicao('dados3', 800)
];
const resultados = await Promise.all(promises);
console.log('Todos os resultados:', resultados);
} catch (erro) {
console.error('Erro em uma das promises:', erro);
}
}
// Promise.race - primeira a resolver
async function competicao() {
const vencedor = await Promise.race([
simularRequisicao('rápido', 500),
simularRequisicao('lento', 2000)
]);
console.log('Vencedor:', vencedor);
}
// Fetch API (requisições HTTP)
async function buscarUsuario(id) {
try {
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const usuario = await response.json();
return usuario;
} catch (erro) {
console.error('Erro ao buscar usuário:', erro);
}
}
Capítulo 9: ES6+ Features
ES6 (ECMAScript 2015) e versões posteriores introduziram recursos modernos que tornaram JavaScript mais poderoso e expressivo. Essas features incluem arrow functions, destructuring, spread/rest operators, template literals, classes, módulos e muito mais.
Principais features: Arrow Functions, Destructuring, Spread/Rest Operators, Template Literals, Default Parameters, Object Shorthand, Computed Properties, Optional Chaining, Nullish Coalescing, Modules.
ES6+ trouxe recursos modernos: arrow functions, destructuring, spread operator, etc.
Features Modernas do JavaScript
// 1. Arrow Functions
const somar = (a, b) => a + b;
const multiplicar = (a, b) => {
const resultado = a * b;
return resultado;
};
// 2. Destructuring
const pessoa = { nome: 'João', idade: 30, cidade: 'SP' };
const { nome, idade, cidade } = pessoa;
const { nome: nomeCompleto } = pessoa; // Renomeando
const frutas = ['maçã', 'banana', 'laranja'];
const [primeira, segunda, terceira] = frutas;
const [primeiraFruta, ...outrasFrutas] = frutas;
// 3. Spread Operator
const array1 = [1, 2, 3];
const array2 = [4, 5, 6];
const arrayCombinado = [...array1, ...array2];
const obj1 = { a: 1, b: 2 };
const obj2 = { c: 3, d: 4 };
const objCombinado = { ...obj1, ...obj2 };
// 4. Rest Parameters
function somarTodos(...numeros) {
return numeros.reduce((total, num) => total + num, 0);
}
// 5. Template Literals
const nome = 'Maria';
const idade = 25;
const mensagem = `Olá, ${nome}! Você tem ${idade} anos.`;
// 6. Default Parameters
function saudar(nome = 'Visitante', saudacao = 'Olá') {
return `${saudacao}, ${nome}!`;
}
// 7. Object Shorthand
const nome2 = 'Pedro';
const idade2 = 28;
const pessoa2 = { nome2, idade2 }; // { nome2: 'Pedro', idade2: 28 }
// 8. Computed Properties
const propriedade = 'cor';
const valor = 'azul';
const objeto = {
[propriedade]: valor,
[`${propriedade}Escura`]: 'azul escuro'
};
// 9. Optional Chaining (ES2020)
const usuario = {
perfil: {
endereco: {
rua: 'Rua das Flores'
}
}
};
const rua = usuario?.perfil?.endereco?.rua; // 'Rua das Flores'
const telefone = usuario?.perfil?.telefone; // undefined
// 10. Nullish Coalescing (ES2020)
const valorPadrao = null ?? 'valor padrão'; // 'valor padrão'
const valorZero = 0 ?? 'valor padrão'; // 0
// 11. Modules (ES6)
// arquivo: utils.js
export const PI = 3.14159;
export function calcularArea(raio) {
return PI * raio * raio;
}
// arquivo: main.js
import { PI, calcularArea } from './utils.js';
// 12. Class Fields (ES2022)
class Produto {
#preco; // Campo privado
static #contador = 0; // Campo estático privado
constructor(nome, preco) {
this.nome = nome;
this.#preco = preco;
Produto.#contador++;
}
get preco() {
return this.#preco;
}
static get total() {
return Produto.#contador;
}
}
Capítulo 10: Animações e Efeitos
JavaScript permite criar animações complexas e efeitos visuais dinâmicos. Isso pode ser feito manipulando estilos CSS, usando bibliotecas como GSAP, ou criando animações canvas/SVG. Animações melhoram a experiência do usuário e tornam interfaces mais atrativas.
Técnicas: CSS Transitions (transições suaves), CSS Animations (animações keyframe), JavaScript Animations (requestAnimationFrame), Canvas Animations (gráficos dinâmicos), SVG Animations (gráficos vetoriais), Parallax Effects (efeitos de profundidade).
JavaScript pode criar animações complexas. Múltiplas técnicas: CSS, Canvas, SVG.
Exemplos de Animações
// 1. Animações com CSS Transitions
function animarQuadrado() {
const quadrado = document.getElementById('quadrado');
const posicaoAtual = quadrado.style.left;
if (posicaoAtual === '200px') {
quadrado.style.left = '0px';
quadrado.style.transform = 'rotate(0deg)';
} else {
quadrado.style.left = '200px';
quadrado.style.transform = 'rotate(360deg)';
}
}
// 2. Animações com JavaScript (requestAnimationFrame)
function animarTexto() {
const texto = document.getElementById('textoAnimado');
let opacidade = 0;
let escala = 0.5;
function animar() {
opacidade += 0.02;
escala += 0.02;
texto.style.opacity = opacidade;
texto.style.transform = `scale(${escala})`;
if (opacidade < 1) {
requestAnimationFrame(animar);
}
}
animar();
}
// 3. Animações de cor
function animarCor() {
const quadrado = document.getElementById('quadrado');
const cores = ['#6fa3ef', '#ff6b6b', '#51cf66', '#ffd43b', '#ae3ec9'];
let indice = 0;
setInterval(() => {
quadrado.style.backgroundColor = cores[indice];
indice = (indice + 1) % cores.length;
}, 1000);
}
// 4. Animações com CSS Keyframes
const keyframes = `
@keyframes bounce {
0%, 20%, 50%, 80%, 100% {
transform: translateY(0);
}
40% {
transform: translateY(-30px);
}
60% {
transform: translateY(-15px);
}
}
`;
// 5. Animações de entrada
function animarEntrada(elemento) {
elemento.style.opacity = '0';
elemento.style.transform = 'translateY(50px)';
setTimeout(() => {
elemento.style.transition = 'all 0.8s ease-out';
elemento.style.opacity = '1';
elemento.style.transform = 'translateY(0)';
}, 100);
}
// 6. Parallax Effect
window.addEventListener('scroll', () => {
const scrolled = window.pageYOffset;
const parallax = document.querySelector('.parallax');
const speed = scrolled * 0.5;
parallax.style.transform = `translateY(${speed}px)`;
});
// 7. Animações com Canvas
function animarCanvas() {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
let x = 0;
function desenhar() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = '#6fa3ef';
ctx.fillRect(x, 50, 50, 50);
x += 2;
if (x > canvas.width) x = 0;
requestAnimationFrame(desenhar);
}
desenhar();
}
// Event listeners
document.getElementById('animarQuadrado').addEventListener('click', animarQuadrado);
document.getElementById('animarTexto').addEventListener('click', animarTexto);
document.getElementById('animarCor').addEventListener('click', animarCor);