Trabalhando com Texto em JavaScript
Imagine que você está criando um aplicativo de mensagens, um site de notícias ou até mesmo um simples formulário de cadastro. O que todos esses projetos têm em comum? A necessidade de trabalhar com texto! Em programação, chamamos esses textos de strings, e elas são um dos tipos de dados mais importantes e utilizados no JavaScript.
Nesta aula, você aprenderá não apenas como usar strings, mas por que elas funcionam de uma determinada maneira, quais são os diferentes métodos de criá-las e manipulá-las, e quando usar cada abordagem. Vamos transformar você de alguém que simplesmente escreve texto no código para alguém que domina a arte de manipular informações textuais com elegância e eficiência.
O que são Strings?
Conceito Fundamental
String é uma sequência de caracteres usada para representar texto. Pense em uma string como um colar de contas, onde cada conta é um caractere (letra, número, símbolo ou espaço). Assim como um colar tem contas em uma ordem específica, uma string tem caracteres em uma ordem específica.
let saudacao = "Olá, mundo!";
let nome = "Maria";
let numero = "123"; // Atenção: isso é texto, não número!
Por que strings são importantes?
Strings são a ponte entre humanos e computadores para comunicação textual. Praticamente tudo que você vê em uma tela — mensagens, nomes, descrições, artigos — é representado por strings. Dominar strings é essencial para:
- Interagir com usuários: capturar e exibir informações
- Processar dados: validar emails, formatar nomes, buscar palavras
- Comunicar com sistemas: enviar e receber mensagens de servidores
- Criar experiências: construir interfaces dinâmicas e personalizadas
Criando Strings: Três Formas Diferentes
JavaScript oferece três maneiras de criar strings, cada uma com suas características e usos específicos. Compreender quando usar cada uma é fundamental.
Aspas Simples (')
let mensagem = 'Olá, pessoal!';
let cidade = 'São Paulo';
Quando usar: Para strings simples e diretas, especialmente quando o texto contém aspas duplas naturalmente.
let frase = 'Ele disse: "Bom dia!"'; // Aspas duplas dentro funcionam
Aspas Duplas (")
let mensagem = "Olá, pessoal!";
let cidade = "São Paulo";
Quando usar: Funciona exatamente como aspas simples. A escolha entre aspas simples e duplas é geralmente uma questão de preferência pessoal ou padrão do projeto.
let frase = "É um dia maravilhoso!"; // Apóstrofo funciona naturalmente
Template Literals (Crases `)
let nome = "Carlos";
let idade = 25;
let mensagem = `Meu nome é ${nome} e tenho ${idade} anos.`;
console.log(mensagem); // "Meu nome é Carlos e tenho 25 anos."
Quando usar: Template literals são a forma moderna e mais poderosa. Use quando precisar:
- Inserir variáveis no texto (interpolação)
- Criar textos com múltiplas linhas
- Realizar cálculos dentro do texto
Template Literals: O Poder da Interpolação
Interpolação de Variáveis
Interpolação significa inserir valores de variáveis diretamente dentro de uma string. É como ter espaços em branco em uma frase que são preenchidos automaticamente.
let produto = "Notebook";
let preco = 3500;
let mensagem = `O ${produto} custa R$ ${preco}`;
console.log(mensagem); // "O Notebook custa R$ 3500"
Por que isso é melhor que concatenação?
// Forma antiga (concatenação)
let mensagem1 = "O " + produto + " custa R$ " + preco;
// Forma moderna (interpolação)
let mensagem2 = `O ${produto} custa R$ ${preco}`;
A interpolação é mais legível, menos propensa a erros e mais fácil de manter.
Expressões JavaScript dentro de Strings
Dentro de ${} você pode colocar qualquer expressão JavaScript válida:
let produto = "Mouse";
let preco = 50;
let quantidade = 3;
let total = `Total: R$ ${preco * quantidade}`;
console.log(total); // "Total: R$ 150"
let desconto = `Preço com desconto: R$ ${preco - (preco * 0.1)}`;
console.log(desconto); // "Preço com desconto: R$ 45"
Strings Multilinhas
Template literals permitem criar textos com várias linhas naturalmente:
let email = `
Olá, ${nome}!
Bem-vindo ao nosso sistema.
Estamos felizes em tê-lo conosco.
Atenciosamente,
Equipe de Suporte
`;
Importante: Aspas simples e duplas não suportam múltiplas linhas naturalmente!
// Isso causará ERRO:
let errado = "Primeira linha
Segunda linha";
// Forma correta com aspas (usando \n):
let correto = "Primeira linha\nSegunda linha";
Caracteres Especiais: Sequências de Escape
Às vezes precisamos incluir caracteres especiais em strings. Para isso, usamos a barra invertida (\) seguida de um código. Chamamos isso de "sequência de escape".
Principais Sequências de Escape
// Nova linha
let texto1 = "Primeira linha\nSegunda linha";
console.log(texto1);
/* Saída:
Primeira linha
Segunda linha
*/
// Tabulação
let texto2 = "Nome:\tJoão";
console.log(texto2); // "Nome: João"
// Aspas dentro de aspas
let texto3 = "Ela disse: \"Olá!\"";
console.log(texto3); // 'Ela disse: "Olá!"'
let texto4 = 'It\'s a beautiful day';
console.log(texto4); // "It's a beautiful day"
// Barra invertida
let caminho = "C:\\Users\\Documents";
console.log(caminho); // "C:\Users\Documents"
Tabela de Sequências de Escape
| Sequência | Significado | Exemplo |
|-----------|-------------|---------|
| \n | Nova linha | "Linha 1\nLinha 2" |
| \t | Tabulação (tab) | "Nome\tIdade" |
| \" | Aspas duplas | "Disse: \"Oi\"" |
| \' | Aspas simples | 'It\'s ok' |
| \\ | Barra invertida | "C:\\pasta" |
Conceito importante: Sequências de escape são necessárias porque alguns caracteres têm significados especiais em strings e precisamos "escapar" desse significado especial para usá-los literalmente.
Concatenação: Juntando Strings
Concatenação é o ato de juntar duas ou mais strings para formar uma nova string. É como colar palavras uma após a outra.
Usando o Operador +
let nome = "Ana";
let sobrenome = "Silva";
let nomeCompleto = nome + " " + sobrenome;
console.log(nomeCompleto); // "Ana Silva"
Concatenando com Variáveis de Diferentes Tipos
JavaScript automaticamente converte outros tipos para string durante a concatenação:
let texto = "Capítulo ";
let numero = 5;
let resultado = texto + numero;
console.log(resultado); // "Capítulo 5"
Um Comportamento Importante: + vs -
Este é um conceito crucial para entender como JavaScript trabalha:
console.log("5" + 1); // "51" (concatenação)
console.log("5" - 1); // 4 (subtração numérica)
Por quê? O operador + tem um significado especial com strings (concatenação), mas o operador - não. Quando JavaScript vê -, ele tenta converter tudo para números.
console.log("10" + 5); // "105" (string)
console.log("10" - 5); // 5 (número)
console.log("10" * 2); // 20 (número)
console.log("10" / 2); // 5 (número)
Implicação prática: Tenha cuidado ao trabalhar com valores de formulários HTML, pois eles sempre vêm como strings!
Propriedades e Métodos Essenciais
Strings em JavaScript são objetos especiais que vêm com diversas ferramentas integradas. Vamos explorar as mais importantes.
Propriedade length - Comprimento da String
A propriedade length retorna quantos caracteres existem na string:
let palavra = "JavaScript";
console.log(palavra.length); // 10
let frase = "Olá, mundo!";
console.log(frase.length); // 11 (espaços e pontuação contam!)
let vazia = "";
console.log(vazia.length); // 0
Por que é útil?
- Validar tamanho de senhas
- Limitar caracteres em formulários
- Contar palavras em textos
Acessando Caracteres Individuais
Strings funcionam como arrays de caracteres. Cada caractere tem uma posição (índice) começando do zero:
let nome = "Maria";
// 01234 (posições/índices)
console.log(nome[0]); // "M"
console.log(nome[1]); // "a"
console.log(nome[4]); // "a"
Acessando o último caractere:
let palavra = "Programação";
let ultimo = palavra[palavra.length - 1];
console.log(ultimo); // "o"
Por que length - 1? Porque os índices começam em 0, então o último caractere está na posição (tamanho - 1).
Método includes() - Verificar se Contém Texto
Verifica se uma string contém outra string dentro dela:
let frase = "Eu adoro programar em JavaScript";
console.log(frase.includes("JavaScript")); // true
console.log(frase.includes("Python")); // false
console.log(frase.includes("programar")); // true
Caso prático: Sistema de busca
let produto = "Notebook Dell Inspiron 15";
let termoBusca = "dell";
if (produto.toLowerCase().includes(termoBusca.toLowerCase())) {
console.log("Produto encontrado!");
}
Métodos startsWith() e endsWith()
Verificam se uma string começa ou termina com determinado texto:
let arquivo = "relatorio.pdf";
console.log(arquivo.startsWith("relatorio")); // true
console.log(arquivo.endsWith(".pdf")); // true
console.log(arquivo.endsWith(".doc")); // false
Caso prático: Validação de tipos de arquivo
let nomeArquivo = "imagem.jpg";
if (nomeArquivo.endsWith(".jpg") || nomeArquivo.endsWith(".png")) {
console.log("Arquivo de imagem válido!");
} else {
console.log("Tipo de arquivo não suportado.");
}
Método indexOf() - Encontrar Posição
Retorna a posição (índice) da primeira ocorrência de um texto dentro de uma string. Se não encontrar, retorna -1:
let frase = "JavaScript é incrível, JavaScript é poderoso";
console.log(frase.indexOf("JavaScript")); // 0 (primeira ocorrência)
console.log(frase.indexOf("Python")); // -1 (não encontrado)
console.log(frase.indexOf("é")); // 11
Buscar a partir de uma posição:
let texto = "JavaScript é incrível, JavaScript é poderoso";
console.log(texto.indexOf("JavaScript", 15)); // 23 (segunda ocorrência)
Método slice() - Extrair Parte da String
Extrai uma parte da string criando uma nova string:
let palavra = "Programação";
// 0123456789...
console.log(palavra.slice(0, 8)); // "Programa"
console.log(palavra.slice(8)); // "ção"
console.log(palavra.slice(-4)); // "ação" (conta de trás pra frente)
Sintaxe: slice(início, fim) - extrai do início até fim (não incluindo o fim)
Caso prático: Pegar primeiras palavras
let texto = "JavaScript é uma linguagem incrível";
let primeiraParte = texto.slice(0, 10);
console.log(primeiraParte + "..."); // "JavaScript..."
Métodos toLowerCase() e toUpperCase()
Convertem toda a string para minúsculas ou maiúsculas:
let nome = "JavaScript";
console.log(nome.toLowerCase()); // "javascript"
console.log(nome.toUpperCase()); // "JAVASCRIPT"
Por que é importante? Para comparações sem diferenciar maiúsculas/minúsculas:
let senha = "SenhaSecreta123";
let confirmacao = "senhasecreta123";
if (senha.toLowerCase() === confirmacao.toLowerCase()) {
console.log("Senhas coincidem!");
}
Métodos replace() e replaceAll()
Substituem partes de uma string por outro texto:
let frase = "Eu gosto de café";
let novaFrase = frase.replace("café", "chá");
console.log(novaFrase); // "Eu gosto de chá"
Diferença entre replace() e replaceAll():
let texto = "Java é bom, Java é útil";
// replace() substitui apenas a primeira ocorrência
console.log(texto.replace("Java", "JavaScript"));
// "JavaScript é bom, Java é útil"
// replaceAll() substitui todas as ocorrências
console.log(texto.replaceAll("Java", "JavaScript"));
// "JavaScript é bom, JavaScript é útil"
Conceito Fundamental: Imutabilidade de Strings
Um conceito crucial que você precisa entender:
Strings são IMUTÁVEIS
Isso significa que uma vez criada, uma string não pode ser modificada. Todos os métodos que "modificam" uma string na verdade criam e retornam uma NOVA string.
let original = "JavaScript";
let modificada = original.toUpperCase();
console.log(original); // "JavaScript" (permanece inalterada!)
console.log(modificada); // "JAVASCRIPT" (nova string)
Por que isso importa?
let nome = "maria";
nome.toUpperCase(); // Isso NÃO modifica nome!
console.log(nome); // Ainda é "maria"
// Forma correta:
nome = nome.toUpperCase();
console.log(nome); // Agora é "MARIA"
Ou usando outra variável:
let nomeOriginal = "maria";
let nomeMaiusculo = nomeOriginal.toUpperCase();
console.log(nomeOriginal); // "maria"
console.log(nomeMaiusculo); // "MARIA"
Conversão Entre Tipos
String para Número
let textoNumero = "42";
let numero = Number(textoNumero);
console.log(typeof textoNumero); // "string"
console.log(typeof numero); // "number"
// Agora pode fazer operações matemáticas
console.log(numero + 8); // 50
Cuidado com valores inválidos:
let invalido = Number("abc");
console.log(invalido); // NaN (Not a Number)
Número para String
let numero = 123;
let texto = String(numero);
console.log(typeof numero); // "number"
console.log(typeof texto); // "string"
// Ou usando toString()
let texto2 = numero.toString();
Exemplos Práticos
Exemplo 1: Formatação de Nome
// Problema: Usuário digitou nome todo em maiúsculas
let nomeUsuario = "JOÃO DA SILVA";
// Solução: Primeira letra maiúscula, resto minúscula
let nomeMinusculo = nomeUsuario.toLowerCase();
let primeiraLetra = nomeMinusculo[0].toUpperCase();
let restoDoNome = nomeMinusculo.slice(1);
let nomeFormatado = primeiraLetra + restoDoNome;
console.log(nomeFormatado); // "João da silva"
Exemplo 2: Validação Simples de Email
let email = "usuario@email.com";
// Verificar se contém @ e .
let temArroba = email.includes("@");
let temPonto = email.includes(".");
let posicaoArroba = email.indexOf("@");
let posicaoPonto = email.lastIndexOf(".");
// Email válido se:
// - Tem @ e .
// - @ vem antes do .
// - Tem pelo menos 1 caractere antes do @
let emailValido = temArroba &&
temPonto &&
posicaoArroba > 0 &&
posicaoPonto > posicaoArroba;
if (emailValido) {
console.log("Email parece válido!");
} else {
console.log("Email inválido!");
}
Exemplo 3: Extrair Extensão de Arquivo
let nomeArquivo = "documento.pdf";
// Encontrar a posição do último ponto
let posicaoUltimoPonto = nomeArquivo.lastIndexOf(".");
// Extrair a extensão
let extensao = nomeArquivo.slice(posicaoUltimoPonto + 1);
console.log(`Extensão: ${extensao}`); // "Extensão: pdf"
// Verificar tipo de arquivo
if (extensao === "pdf" || extensao === "doc") {
console.log("Documento de texto");
} else if (extensao === "jpg" || extensao === "png") {
console.log("Arquivo de imagem");
}
Exemplo 4: Criando uma Saudação Personalizada
let nome = "Maria";
let hora = 14; // 14:00 (2 da tarde)
let periodo;
if (hora < 12) {
periodo = "Bom dia";
} else if (hora < 18) {
periodo = "Boa tarde";
} else {
periodo = "Boa noite";
}
let saudacao = `${periodo}, ${nome}! Bem-vinda ao sistema.`;
console.log(saudacao); // "Boa tarde, Maria! Bem-vinda ao sistema."
Boas Práticas ao Trabalhar com Strings
1. Escolha Consistente de Aspas
// Escolha um estilo e mantenha em todo o projeto
let opcao1 = 'Usando aspas simples';
let opcao2 = "Usando aspas duplas";
// Use template literals quando precisar de interpolação
let nome = "João";
let mensagem = `Olá, ${nome}!`; // Melhor que "Olá, " + nome + "!"
2. Use Template Literals para Clareza
// ❌ Evite concatenação complexa
let msg1 = "O " + produto + " custa R$ " + preco + " e está em " + status;
// ✅ Prefira template literals
let msg2 = `O ${produto} custa R$ ${preco} e está em ${status}`;
3. Lembre-se da Imutabilidade
// ❌ Errado: modificação não é salva
let texto = "javascript";
texto.toUpperCase();
console.log(texto); // Ainda é "javascript"
// ✅ Correto: salvar o resultado
let texto = "javascript";
texto = texto.toUpperCase();
console.log(texto); // "JAVASCRIPT"
4. Use Métodos Apropriados para Cada Tarefa
// Para verificar se contém
if (texto.includes("palavra")) { }
// Para verificar início/fim
if (arquivo.endsWith(".pdf")) { }
// Para extrair partes
let parte = texto.slice(0, 10);
// Para substituir
let novo = texto.replace("antigo", "novo");
Próximos passos
Na próxima aula você aprenderá sobre Estruturas de Repetição (loops):
- Como automatizar tarefas repetitivas
- Loop for tradicional
- Loops while e do...while
- Controle de fluxo com break e continue
- Quando usar cada tipo de loop
Prepare-se para multiplicar o poder dos seus programas! 💪
Lembre-se: programação é prática! Experimente cada conceito, teste os exemplos, crie variações e explore possibilidades