Trabalhando com Strings
Esta aula aborda a criação e manipulação de strings em JavaScript, incluindo o uso de aspas, template literals, métodos essenciais, o conceito de imutabilidade e noções básicas de Unicode. O conteúdo é prático e progressivo, com exemplos de código e exercícios para fixação.
Nesta aula, você aprenderá a trabalhar com strings em JavaScript, desde a criação até métodos avançados de manipulação. As strings são sequências de caracteres usadas para representar texto, e são fundamentais em qualquer aplicação. Vamos explorar as diferentes formas de criar strings, como usar template literals para interpolação, os métodos mais comuns para manipulação, a imutabilidade das strings e noções básicas de Unicode para lidar com caracteres especiais.
Ao final, você será capaz de criar, modificar e analisar strings de forma eficiente, compreendendo as particularidades da linguagem. Vamos começar!
Criação e aspas
Em JavaScript, strings podem ser criadas usando aspas simples (' '), aspas duplas (" ") ou crases (` `). Todas são equivalentes, mas é importante manter consistência. Aspas simples e duplas funcionam de forma idêntica, enquanto as crases permitem template literals, que veremos a seguir.
Ao criar uma string, você pode incluir caracteres escapados com a barra invertida (\), como \n para nova linha ou \t para tabulação. Exemplo:
let nome = 'João';
let frase = "Ele disse: \"Olá!\"";
console.log(nome); // João
console.log(frase); // Ele disse: "Olá!"É recomendado escolher um estilo e mantê-lo em todo o projeto. Muitos guias de estilo preferem aspas simples para strings, a menos que a string contenha aspas simples, caso em que se usa aspas duplas ou crases.
Template literals
Template literals (ou template strings) são strings delimitadas por crases (` `) que permitem interpolação de expressões usando ${expressão} e podem abranger múltiplas linhas. Isso torna a concatenação mais legível e poderosa.
Exemplo de interpolação:
let nome = 'Maria';
let idade = 30;
let mensagem = `Olá, ${nome}! Você tem ${idade} anos.`;
console.log(mensagem); // Olá, Maria! Você tem 30 anos.Template literals também preservam quebras de linha:
let texto = `Linha 1
Linha 2`;
console.log(texto);
// Linha 1
// Linha 2Além disso, você pode usar tagged templates para processar o template com uma função, mas isso é um tópico mais avançado.
Métodos essenciais
JavaScript oferece diversos métodos para manipular strings. Aqui estão os mais importantes:
length: retorna o número de caracteres (não é um método, mas uma propriedade).toUpperCase()etoLowerCase(): convertem para maiúsculas/minúsculas.indexOf(): retorna o índice da primeira ocorrência de uma substring, ou -1 se não encontrada.slice(start, end): extrai uma parte da string do índicestartatéend(não incluindoend).replace(): substitui parte da string (apenas a primeira ocorrência, a menos que use regex global).split(): divide a string em um array com base em um separador.trim(): remove espaços em branco das extremidades.
Exemplos:
let str = ' JavaScript é incrível! ';
console.log(str.length); // 26
console.log(str.toUpperCase()); // JAVASCRIPT É INCRÍVEL!
console.log(str.indexOf('Script')); // 4
console.log(str.slice(2, 12)); // JavaScript
console.log(str.replace('incrível', 'fantástico')); // JavaScript é fantástico!
console.log(str.trim()); // JavaScript é incrível!
console.log('a,b,c'.split(',')); // ['a', 'b', 'c']Muitos métodos retornam uma nova string, pois strings são imutáveis (próximo tópico).
Imutabilidade
Strings em JavaScript são imutáveis, ou seja, não podem ser alteradas após a criação. Qualquer operação que pareça modificar a string na verdade retorna uma nova string, deixando a original intacta.
Exemplo:
let str = 'Olá';
str.toUpperCase(); // retorna 'OLÁ', mas str continua 'Olá'
console.log(str); // 'Olá'
// Para "modificar", precisamos reatribuir:
str = str.toUpperCase();
console.log(str); // 'OLÁ'Isso tem implicações de desempenho em loops que manipulam muitas strings, mas para a maioria dos casos é transparente. É importante lembrar que métodos como replace() ou slice() sempre retornam novas strings.
Unicode básico
JavaScript usa a codificação UTF-16 para strings. Isso significa que caracteres comuns (como letras latinas) ocupam 1 unidade de código (16 bits), enquanto caracteres especiais (emoji, caracteres de scripts raros) podem ocupar 2 unidades (surrogate pairs).
Propriedades como length contam unidades de código, não caracteres visíveis. Por exemplo:
let emoji = '😀';
console.log(emoji.length); // 2 (pois é um surrogate pair)
console.log(emoji); // 😀Para iterar por caracteres reais, use o operador spread ou Array.from():
let chars = [...emoji];
console.log(chars.length); // 1
console.log(chars); // ['😀']Além disso, métodos como charCodeAt() e codePointAt() ajudam a trabalhar com códigos Unicode. codePointAt() lida corretamente com surrogate pairs.
Exemplo:
let str = 'A';
console.log(str.charCodeAt(0)); // 65 (código ASCII)
console.log(str.codePointAt(0)); // 65
let emoji = '😀';
console.log(emoji.charCodeAt(0)); // 55357 (parte alta do surrogate)
console.log(emoji.codePointAt(0)); // 128512 (código completo)Entender Unicode é essencial para internacionalização e para evitar bugs com caracteres especiais.
Boas práticas
Ao trabalhar com strings, prefira template literals para concatenação e strings multilinha. Use métodos como includes() e startsWith() para buscas mais semânticas. Sempre considere a imutabilidade para evitar efeitos colaterais.
Referências
- MDN: String
- MDN: Template literals
- MDN: String.length
- MDN: String.prototype.toUpperCase()
- MDN: String.prototype.slice()
- MDN: String.prototype.replace()
- MDN: String.prototype.split()
- MDN: String.prototype.trim()
- MDN: Formatação de texto
- Unicode Consortium
Exercícios
Crie uma função que receba um nome e retorne uma saudação usando template literals: "Olá, [nome]!"
✓ Resposta:function saudacao(nome) { return `Olá, ${nome}!`; } console.log(saudacao('Ana')); // Olá, Ana!Dada a string "Aprendendo JavaScript", use
slice()para extrair a palavra "JavaScript".✓ Resposta:let str = 'Aprendendo JavaScript'; let palavra = str.slice(11); // a partir do índice 11 console.log(palavra); // JavaScript // Ou: str.slice(11, 21) para ser explícitoEscreva uma função que receba uma string e retorne a mesma string com todas as letras maiúsculas, mas apenas se a string tiver mais de 5 caracteres. Caso contrário, retorne a string original.
✓ Resposta:function transformar(str) { if (str.length > 5) { return str.toUpperCase(); } return str; } console.log(transformar('Olá')); // Olá console.log(transformar('JavaScript')); // JAVASCRIPTExplique com um exemplo o conceito de imutabilidade de strings em JavaScript.
✓ Resposta:Imutabilidade significa que uma string não pode ser alterada depois de criada. Qualquer método que parece modificar a string retorna uma nova string. Exemplo:
let str = 'abc'; str.toUpperCase(); // retorna 'ABC', mas str ainda é 'abc' console.log(str); // 'abc' // Para "mudar", precisamos reatribuir: str = str.toUpperCase(); // agora str é 'ABC'Usando
split()ejoin(), escreva uma função que receba uma frase e retorne a frase com as palavras invertidas (ex: "Olá mundo" -> "mundo Olá").✓ Resposta:function inverterPalavras(frase) { return frase.split(' ').reverse().join(' '); } console.log(inverterPalavras('Olá mundo')); // mundo Olá console.log(inverterPalavras('JavaScript é legal')); // legal é JavaScript