Considerações para alternar os modos JavaScript

  • Versão de lançamento: Yokohama
  • Atualizado 30 de jan. de 2025
  • 3 min. de leitura
  • 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).

    Tabela 1. Diferenças comportamentais nos modos JavaScript
    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:
    *** Script: [object Arguments]
    *** Script: [object Arguments]
    *** Script: [object Arguments]
    *** Script: 123
    No modo estrito, o objeto de argumentos não reflete as modificações de parâmetro e gera um erro. Impressões:
    sn_es5: 123
    sn_es5: undefined
    sn_es5: [object Arguments]
    sn_es5: 123
    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:
    (cond_expr instanceof Boolean ? cond_expr.valueOf() : cond_expr).
    Exceção para erros de sintaxe Erros de sintaxe geram exceções no tempo de execução. O tratamento de erros é inconsistente. Exemplo:
    Javascript compiler exception: unterminated string literal (null.null.script; line 1) in:
    var b = '
    Manipulação de erros de sintaxe mais consistente, especialmente no modo estrito. Exemplo:
    Evaluator: com.glide.script.RhinoEcmaError: unterminated string literal
       script : Line(1) column(9)
    ==>   1: var b = '
    Igual ao ES5, mas com tratamento mais robusto e mensagens de erro mais claras em mecanismos atualizados. Exemplo:
    SyntaxError: Unterminated string constant at line 1
    
    ==>   1: var b = '
    Incrementar e decrementar Permitido em variáveis, mas pode se comportar de forma inesperada com expressões complexas. Impressões:
    *** Script: c: 1
    *** Script: gr.related_incidents: 1
    *** Script: 2
    *** Script: 3
    Maior clareza, mas ainda permitida em variáveis (var, deixe, const). Impressões:
    sn_es5: c: 0
    sn_es5: gr.related_incidents: 1
    sn_es5: 1
    sn_es5: 2
    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.
    var expr = doFoo();  // do foo
               doBar();  // do bar 
               finish();   // all done
     eval(expr);
    
    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.