Considerações para alternar os modos JavaScript
Alternar o modo JavaScript de uma aplicação ou script pode mudar o comportamento dos scripts existentes. Revise alguns exemplos de mudanças de comportamento antes de alternar os modos JavaScript ou para solucionar quaisquer problemas que você tenha após a alternância.
Para obter mais informações sobre cada modo JavaScript, consulte Modos JavaScript e Suporte ao recurso do mecanismo JavaScript.
Esta tabela destaca como o comportamento do JavaScript evoluiu do ambiente pré-ES5 leniente e sujeito a erros para o ES5 mais estrito e previsível e, por último, o ambiente com mais recursos do ES12 (ECMAScript 2021).
| Funcionalidade | Modo de compatibilidade | ES5 modo padrão | ECMAScript 2021 (ES12) |
|---|---|---|---|
| Objeto de argumentos | O objeto de argumentos existe, mas não há modo estrito, portanto, as modificações são refletidas nos argumentos. Impressões: |
No modo estrito, o objeto de argumentos não reflete as modificações de parâmetro e gera um erro. Impressões: |
O mesmo que ES5. |
| Substituições boolianas | Boolianos primitivos (verdadeiro, falso) podem ser substituídos, causando um comportamento inesperado. |
Os boolianos primitivos são mais protegidos, embora ainda possam ser substituídos quando atribuídos a variáveis. | Igual ao ES5, mas o modo estrito ajuda a evitar algumas atribuições. A expressão condicional deve ser escrita neste formulário: |
| Exceção para erros de sintaxe | Erros de sintaxe geram exceções no tempo de execução. O tratamento de erros é inconsistente. Exemplo: |
Manipulação de erros de sintaxe mais consistente, especialmente no modo estrito. Exemplo: |
Igual ao ES5, mas com tratamento mais robusto e mensagens de erro mais claras em mecanismos atualizados. Exemplo: |
| Incrementar e decrementar | Permitido em variáveis, mas pode se comportar de forma inesperada com expressões complexas. Impressões: |
Maior clareza, mas ainda permitida em variáveis (var, deixe, const). Impressões: |
Igual ao ES5, com regras mais rígidas em alguns contextos (por exemplo, const). |
| Continuações de linha | Permitido com uma barra invertida (\), mas não recomendado devido a problemas de leitura. Neste exemplo, todas as três funções são chamadas. |
Igual ao modo de compatibilidade; nenhuma mudança na manipulação de continuações de linha. No exemplo anterior, o ES5 chama somente a primeira função e trata tudo após o primeiro comentário, incluindo a nova linha como comentário até o fim da expressão. | O mesmo que ES5, mas os literais de modelo fornecem uma alternativa mais legível. |
| Ponto e vírgula ausentes | A inserção automática de ponto e vírgula (ASI) geralmente leva a um comportamento inesperado. | Lança um erro de sintaxe quando um ponto e vírgula está ausente. | O mesmo que ES5. As práticas atualizadas incentivam o uso de ponto-e-vírgula explícito. |
| Funções inexistentes | Chamar uma função inexistente gera um Erro de Referência. |
Lança um TypeError se uma não função for chamada. |
Lança um EcmaError quando uma função inexistente é chamada ou uma propriedade é referenciada. |
| Propriedades inexistentes | O acesso a uma propriedade inexistente retorna undefined; nenhum erro gerado. |
Igual ao pré-ES5. | O mesmo que o modo de compatibilidade e o modo ES5 Standards. |
| Literais numéricos | Literais decimais e hexadecimais básicos. | Regras de análise mais rígidas introduzidas e melhor manipulação de literais numéricos. | Adição de literais binários (0b), octal (0o) e BigInt (123n). |
| Palavra-chave reservada como propriedade | Não é possível usar palavras-chave reservadas. | As palavras-chave reservadas podem ser usadas como nomes de propriedade sem erro, por exemplo, obj.for. Imprime o objeto quando retornado. |
O mesmo que ES5. |
| Tratar deixe e render como palavras-chave | deixe e rendimento não são palavras-chave e podem ser usadas somente como identificadores. |
deixe é introduzido como uma palavra-chave. O rendimento é reservado no modo estrito. |
Ambas são palavras-chave. Usá-los como identificadores gera erros de sintaxe. |