W3docs

Escapando Caracteres Especiais em JavaScript

Aprenda a escapar caracteres especiais em strings e expressões regulares do JavaScript: aspas, barras invertidas, sequências de escape e JSON.stringify.

Introdução

Em JavaScript, escapar caracteres especiais é uma habilidade fundamental para desenvolvedores, permitindo a criação de strings que incluem caracteres que, de outra forma, seriam interpretados de maneira diferente pelo processador da linguagem. Este artigo aborda com profundidade os métodos e a importância de escapar caracteres especiais, fornecendo aos desenvolvedores o conhecimento e as ferramentas para gerenciar strings complexas de forma eficaz.

Entendendo Caracteres Especiais

Um caractere especial é qualquer caractere que o analisador de JavaScript interpretaria como parte da sintaxe em vez de texto literal. Os mais importantes se enquadram em dois grupos:

  • Delimitadores de string — os caracteres de aspas ', " e ` que marcam onde uma string começa e termina.
  • Sequências de escape — combinações que começam com uma barra invertida (\) e representam caracteres difíceis de digitar ou invisíveis, como uma nova linha ou uma tabulação.

Se você colocar uma aspa de fechamento dentro de uma string do mesmo tipo, o analisador entenderá que a string terminou cedo e o restante da linha se tornará um erro de sintaxe. O escape resolve isso.

Sequências de Escape Comuns

Essas sequências de barra invertida são reconhecidas dentro de literais de string JavaScript:

SequênciaSignificado
\nNova linha (alimentação de linha)
\tTabulação horizontal
\rRetorno de carro
\\Uma barra invertida literal
\'Uma aspa simples literal
\"Uma aspa dupla literal
\`Um backtick literal
\uXXXXUm ponto de código Unicode (ex.: é é é)
\u{XXXX}Um ponto de código Unicode por valor hexadecimal (ex.: \u{1F600} é 😀)

Qualquer caractere que não inicie uma sequência de escape reconhecida simplesmente descarta a barra invertida: '\q' é apenas 'q'.

Como Escapar Caracteres Especiais em Strings

Para incluir um caractere especial sem acionar seu significado, preceda-o com uma barra invertida (\). Isso diz ao JavaScript para tratar o próximo caractere como texto literal.

A regra principal para aspas: você só precisa escapar o caractere de aspa que corresponde ao delimitador da sua string. Uma string com aspas simples pode conter aspas duplas sem escape, e vice-versa.

Exemplo: Escapando Aspas

javascript— editable

Na primeira string, as barras invertidas escapam as aspas simples para que se tornem parte do texto em vez de encerrar a string. A segunda string evita o escape completamente usando um delimitador diferente.

Evitando Escapes com Template Literals

O JavaScript moderno também suporta template literals (backticks), que permitem incorporar tanto ' quanto " sem escape, abranger múltiplas linhas e interpolar expressões com ${...}. Dentro de um template literal, você só precisa escapar backticks e ${.

javascript— editable

Isso imprime duas linhas, com ambos os estilos de aspas intactos, sem barras invertidas necessárias.

Escapando em Expressões Regulares

Expressões regulares também usam caracteres especiais, e escapá-los é crucial para a correspondência de padrões. Metacaracteres como . (qualquer caractere), * (repetição), +, ?, (, ), [, ], {, }, ^, $, | e \ têm significados especiais, portanto, para correspondê-los literalmente, você deve escapá-los com uma barra invertida.

Uma barra invertida desempenha dois papéis diferentes em regex:

  • Ela escapa um metacaractere para que corresponda literalmente — \. corresponde a um ponto real.
  • Ela introduz um atalho de classe de caractere\d corresponde a um dígito, \w a um caractere de palavra, \s a um espaço em branco. Aqui, a barra invertida faz parte de um token, não está escapando uma letra.
Aviso

When you build a regex from a string (via new RegExp(...)) every backslash must be doubled, because the string parser consumes one backslash before the regex engine ever sees it. new RegExp('\\d+') is equivalent to the literal /\d+/.

Exemplo: Correspondendo um Ponto Literal

javascript— editable

Observe que as regras de escape de strings e as regras de escape de regex são independentes. Em strings, as barras invertidas escapam aspas e produzem caracteres de controle; em regex, elas escapam metacaracteres ou formam atalhos como \d.

Escapar caracteres é particularmente útil em:

  • Desenvolvimento web: Garantindo que as entradas do usuário não quebrem o código.
  • Análise de dados: Processando corretamente arquivos de dados que contêm caracteres especiais.

Exemplo: Escapando Entrada do Usuário

<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Sanitize Input Example</title>
        <script>
            function sanitizeInput(input) {
              // This function replaces less-than and greater-than characters with HTML entities
              // to prevent malicious scripts from executing when the input is rendered as HTML.
              const sanitized = input.replace(/</g, '&lt;').replace(/>/g, '&gt;');
              return sanitized;
            }
            function displaySanitizedInput() {
              const unsafeInput = document.getElementById('unsafeInput').value;
              const sanitized = sanitizeInput(unsafeInput);
              document.getElementById('output').textContent = sanitized;
            }
        </script>
    </head>
    <body>
        <h1>Input Sanitization Example</h1>
        <p>
            Enter any HTML content below, including potentially harmful scripts.
            The example will sanitize the input to prevent script execution,
            displaying how it would be rendered safely on a web page.
        </p>
        <label for="unsafeInput">Enter unsafe content:</label>
        <input
            type="text"
            id="unsafeInput"
            value="<script>alert('hack')</script>"
        />
        <button onclick="displaySanitizedInput()">Sanitize and Display</button>
        <p>
            <span style="color:gray">Sanitized Output:</span>
            <span id="output"></span>
        </p>
    </body>
</html>

Este exemplo HTML fornece um campo de entrada onde os usuários podem digitar conteúdo potencialmente inseguro, como uma tag <script>. Quando o usuário clica no botão, a função JavaScript sanitizeInput é chamada, que sanitiza a entrada e atualiza o conteúdo de texto de um elemento <span> para exibir o resultado sanitizado. Observe que este exemplo apenas escapa < e >. Em produção, você também deve escapar aspas (" e ') e usar uma biblioteca de sanitização dedicada para prevenir vulnerabilidades em contextos de atributos.

Deixe a Linguagem Escapar por Você

A maior parte do escape do mundo real deve ser feita por ferramentas integradas em vez de manualmente, o que evita erros sutis:

  • JSON: JSON.stringify() escapa automaticamente aspas, barras invertidas e caracteres de controle, e JSON.parse() reverte isso. Veja Trabalhando com JSON.
  • URLs: encodeURIComponent() escapa caracteres que são inseguros em uma query string.
  • Regex a partir de entrada do usuário: escape cada metacaractere antes de construir um padrão.

Exemplo: Escape Integrado

javascript— editable

Boas Práticas para Escapar Caracteres

  • Escape apenas a aspa que corresponde ao delimitador da sua string, ou mude de delimitadores para evitar o escape completamente.
  • Prefira template literals para strings que misturam estilos de aspas ou abrangem múltiplas linhas.
  • Lembre-se de dobrar as barras invertidas ao passar um padrão para new RegExp().
  • Use JSON.stringify, encodeURIComponent e uma biblioteca de sanitização dedicada em vez de escapar manualmente.
  • Teste strings e padrões de regex para confirmar que se comportam conforme o esperado.

Conclusão

Dominar as sequências de escape em JavaScript aprimora a capacidade do desenvolvedor de lidar com strings e dados de forma eficaz. Seja para aplicações web ou scripts do lado do servidor, entender como escapar caracteres especiais é essencial para um desenvolvimento de código robusto e sem erros.

Prática

Prática
Quais das seguintes afirmações descrevem corretamente as regras para escapar caracteres especiais em expressões regulares JavaScript?
Quais das seguintes afirmações descrevem corretamente as regras para escapar caracteres especiais em expressões regulares JavaScript?
Was this page helpful?