Strings em JavaScript
Strings são um dos tipos de dados mais usados em JavaScript. Nove em cada dez linhas de código que você escreve envolvem strings — exibir texto, construir mensagens, processar entrada do usuário — nada disso funciona sem elas.
Criando Strings
JavaScript oferece três maneiras de criar strings: aspas simples, aspas duplas e crases.
<script>
let a = 'olá'; // Aspas simples
let b = "mundo"; // Aspas duplas
let c = `olá`; // Crases
</script>
Aspas simples e aspas duplas são funcionalmente idênticas — escolha a que preferir. Crases, no entanto, são diferentes: suportam template literals, que são muito mais poderosas. Mais sobre isso abaixo.
Strings São Imutáveis
Esta é uma armadilha que muitos desenvolvedores encontram: uma vez que uma string é criada, seu conteúdo não pode ser alterado. Todo método que você chama retorna uma nova string sem modificar a original.
<script>
let str = 'olá';
str[0] = 'O'; // Falha silenciosamente — str ainda é 'olá'
str.toUpperCase(); // Retorna 'OLÁ', mas str em si não é alterada
let upper = str.toUpperCase(); // Correto — capture o valor de retorno em uma variável
</script>
Lembre-se: métodos de string nunca modificam a original. Você deve atribuir o valor de retorno a uma nova variável.
Métodos Comuns
JavaScript tem muitos métodos de string, mas estes são os que você usará diariamente:
| Método | Propósito | Exemplo |
|---|---|---|
length |
Obter comprimento | 'abc'.length → 3 |
indexOf() |
Encontrar posição de substring | 'olá'.indexOf('lá') → 1 |
slice() |
Extrair substring | 'olá'.slice(1,3) → 'lá' |
replace() |
Substituir conteúdo | 'gato'.replace('g','p') → 'pato' |
toUpperCase() |
Converter para maiúsculas | 'oi'.toUpperCase() → 'OI' |
toLowerCase() |
Converter para minúsculas | 'OI'.toLowerCase() → 'oi' |
trim() |
Remover espaços extras | ' oi '.trim() → 'oi' |
split() |
Dividir em array por delimitador | 'a,b'.split(',') → ['a','b'] |
includes() |
Verificar se substring existe | 'olá'.includes('lá') → true |
startsWith() |
Verificar se string começa com | 'olá'.startsWith('ol') → true |
endsWith() |
Verificar se string termina com | 'olá'.endsWith('lá') → true |
Exemplo: Métodos Comuns de String
<!DOCTYPE html>
<html lang="pt-br">
<body>
<h2>Métodos Comuns de String</h2>
<p id="output"></p>
<script>
let str = ' Olá, JavaScript! ';
let result = '';
result += 'Original: "' + str + '"<br>';
result += 'length: ' + str.length + '<br>';
result += 'trim: "' + str.trim() + '"<br>';
result += 'indexOf("Java"): ' + str.indexOf('Java') + '<br>';
result += 'slice(2,7): "' + str.slice(2, 7) + '"<br>';
result += 'includes("Script"): ' + str.includes('Script') + '<br>';
result += 'startsWith(" O"): ' + str.startsWith(' O') + '<br>';
result += 'toUpperCase: ' + str.toUpperCase() + '<br>';
result += 'replace("JavaScript","Mundo"): ' + str.replace('JavaScript', 'Mundo') + '<br>';
document.getElementById('output').innerHTML = result;
</script>
</body>
</html>
Note que slice(início, fim) extrai do início até mas não incluindo o fim. Isso é consistente com a maioria das linguagens — você vai se acostumar.
Template Literals
Strings criadas com crases (`) são chamadas de template literals. Elas têm dois recursos incríveis:
- Suporte a múltiplas linhas — sem precisar de
\n; basta pressionar Enter - Interpolação — incorpore variáveis ou expressões com
${variável}
<!DOCTYPE html>
<html lang="pt-br">
<head><meta charset="UTF-8"><title>Template Literals</title></head>
<body>
<div id="output"></div>
<script>
let nome = 'Alice';
let idade = 20;
// Jeito antigo: concatenação, fácil de esquecer um sinal de mais
let msg1 = 'Meu nome é ' + nome + ', eu tenho ' + idade + ' anos.';
// Jeito novo: template literals, muito mais limpo
let msg2 = `Meu nome é ${nome}, eu tenho ${idade} anos.`;
document.getElementById('output').innerHTML =
'<strong>Concatenação:</strong>' + msg1 + '<br>' +
'<strong>Template literal:</strong>' + msg2;
</script>
</body>
</html>
Exemplo: Template Literals vs Concatenação
<!DOCTYPE html>
<html lang="pt-br">
<body>
<h2>Comparação de Template Literal</h2>
<p id="output"></p>
<script>
let nome = 'Bob';
let cidade = 'São Paulo';
let hobby = 'pintura';
let old = 'Meu nome é ' + nome + ', moro em ' + cidade + ', e gosto de ' + hobby + '.';
let modern = `Meu nome é ${nome}, moro em ${cidade}, e gosto de ${hobby}.`;
let html = '<strong>Concatenação:</strong>' + old + '<br><br>';
html += '<strong>Template literal:</strong>' + modern + '<br><br>';
let a = 5, b = 3;
html += `<strong>Expressões também funcionam:</strong>${a} + ${b} = ${a + b}<br>`;
html += `<strong>Chamadas de método também:</strong>${nome.toUpperCase()}`;
document.getElementById('output').innerHTML = html;
</script>
</body>
</html>
Caracteres de Escape
Alguns caracteres têm significado especial dentro de strings. Para exibi-los literalmente, use uma barra invertida \ para escapar:
| Caractere de Escape | Significado |
|---|---|
\n |
Nova linha |
\t |
Tabulação |
\\ |
A própria barra invertida |
\" |
Aspa dupla |
\' |
Aspa simples |
Exemplo: Caracteres de Escape
<!DOCTYPE html>
<html lang="pt-br">
<body>
<h2>Demonstração de Caracteres de Escape</h2>
<p id="output"></p>
<script>
let s1 = 'Primeira linha\nSegunda linha';
let s2 = 'Nome\tIdade\tCidade';
let s3 = 'Caminho: C:\\Users\\Admin';
let s4 = 'Ele disse: "Olá!"';
let s5 = 'É um bom dia';
let html = '';
html += '<strong>\\n nova linha:</strong><pre>' + s1 + '</pre>';
html += '<strong>\\t tabulação:</strong><pre>' + s2 + '</pre>';
html += '<strong>\\\\ barra invertida:</strong>' + s3 + '<br>';
html += '<strong>\\" aspa dupla:</strong>' + s4 + '<br>';
html += "<strong>\\' aspa simples:</strong>" + s5 + '<br>';
document.getElementById('output').innerHTML = html;
</script>
</body>
</html>
C:\Users, você precisa de C:\\Users — esquecer de escapar é uma fonte comum de bugs.
Concatenação de String vs Template Literals
Ambas as abordagens funcionam para casos simples, mas a concatenação rapidamente se torna dolorosa à medida que o número de variáveis cresce:
<script>
// Concatenação: fácil de esquecer ou duplicar sinais de mais
let html = '<div class="' + cls + '">' + titulo + '</div>';
// Template literal: claro à primeira vista
let html = `<div class="${cls}">${titulo}</div>`;
</script>
Exemplo: Gerando Conteúdo HTML
<!DOCTYPE html>
<html lang="pt-br">
<body>
<h2>Gerando Conteúdo com Template Literals</h2>
<div id="output"></div>
<script>
let products = [
{ name: 'Notebook', price: 4999 },
{ name: 'Mouse', price: 79 },
{ name: 'Teclado', price: 199 }
];
let html = '<ul>';
for (let p of products) {
html += `<li>${p.name} - R$${p.price.toFixed(2)}</li>`;
}
html += '</ul>';
document.getElementById('output').innerHTML = html;
</script>
</body>
</html>
Usar template literals dentro de loops para gerar HTML é extremamente comum no desenvolvimento real e muito mais agradável que concatenação.
📖 Resumo
- Strings podem ser criadas com aspas simples, aspas duplas ou crases — prefira crases
- Strings são imutáveis; todos os métodos retornam novas strings sem modificar a original
slice(início, fim)inclui o início mas exclui o fim;indexOfretorna-1se não encontrado- Template literals usam
${}para interpolação e suportam expressões e chamadas de método - Caracteres de escape começam com
\—\npara nova linha,\\para uma barra invertida literal trim()é especialmente útil para processar entrada do usuário — não esqueça de usá-lo
❓ Perguntas Frequentes
P:Qual a diferença entre
indexOfeincludes? R:indexOfretorna a posição inicial da substring (ou -1 se não encontrada), enquantoincludesretorna um booleano. Se você só se importa se uma substring existe,includesé mais intuitivo; se precisa da posição exata, useindexOf.
P:Por que
replacesó substitui a primeira ocorrência? R:replacesó substitui a primeira ocorrência por padrão. Para substituir todas, usereplaceAll, ou use uma expressão regular com a flagg:str.replace(/abc/g, 'xyz').
P:Qual devo usar — aspas simples ou aspas duplas? R:São funcionalmente idênticas. Apenas seja consistente dentro da sua equipe. A maioria dos projetos usa aspas simples por padrão e muda para aspas duplas quando a string em si contém aspas simples.
📝 Atividades
- Escreva um programa que recebe uma frase como entrada e exibe a contagem de palavras (dica: use
splitpor espaços, depoislength). - Escreva um programa que transforma a string
" Olá Mundo "em"olá mundo"totalmente em minúsculas e sem espaços, usandotrimetoLowerCase. - Use um template literal para gerar um trecho HTML de auto-apresentação contendo seu nome, idade e hobbies (usando variáveis), e exiba na página.



