Considérations relatives au changement de mode JavaScript

  • Rversion finale: Yokohama
  • Mis à jour 30 janv. 2025
  • 3 minutes de lecture
  • Le changement de mode JavaScript pour une application ou un script peut modifier le comportement des scripts existants. Passez en revue quelques exemples de changements de comportement avant de changer de mode JavaScript ou pour résoudre les problèmes que vous rencontrez après le changement.

    Pour plus d’informations sur chaque mode JavaScript, reportez-vous aux sections Modes JavaScript et Prise en charge de la fonctionnalité du moteur JavaScript.

    Ce tableau met en évidence comment le comportement JavaScript a évolué de l’environnement pré-ES5 indulgent et sujet aux erreurs, à l’environnement ES5 plus strict et plus prévisible, et enfin à l’environnement plus riche en fonctionnalités d’ES12 (ECMAScript 2021).

    Tableau 1. Différences de comportement en mode JavaScript
    Fonctionnalité Mode de compatibilité Mode standard ES5 ECMAScript 2021 (ES12)
    Objet des arguments L’objet arguments existe, mais il n’y a pas de mode strict, donc les modifications se répercutent sur les arguments. Impressions:
    *** Script: [object Arguments]
    *** Script: [object Arguments]
    *** Script: [object Arguments]
    *** Script: 123
    En mode strict, l’objet arguments ne reflète pas les modifications de paramètres et génère une erreur. Impressions:
    sn_es5: 123
    sn_es5: undefined
    sn_es5: [object Arguments]
    sn_es5: 123
    Identique à ES5.
    Remplacements booléens Les booléens primitifs (vrai, faux) peuvent être remplacés, provoquant un comportement inattendu. Les booléens primitifs sont plus protégés, bien qu’ils puissent toujours être remplacés lorsqu’ils sont affectés à des variables. Identique à ES5, mais le mode strict permet d’éviter certaines affectations. L’expression conditionnelle doit être écrite sous la forme suivante :
    (cond_expr instanceof Boolean ? cond_expr.valueOf() : cond_expr).
    Exception pour erreurs de syntaxe Les erreurs de syntaxe lèvent des exceptions lors de l’exécution. La gestion des erreurs est incohérente. Exemple :
    Javascript compiler exception: unterminated string literal (null.null.script; line 1) in:
    var b = '
    Gestion plus cohérente des erreurs de syntaxe, en particulier en mode strict. Exemple :
    Evaluator: com.glide.script.RhinoEcmaError: unterminated string literal
       script : Line(1) column(9)
    ==>   1: var b = '
    La même chose que l’ES5, mais avec une maniabilité plus robuste et des messages d’erreur plus clairs dans les moteurs mis à jour. Exemple :
    SyntaxError: Unterminated string constant at line 1
    
    ==>   1: var b = '
    Incrémenter et décrémenter Autorisé sur les variables, mais peut se comporter de façon inattendue avec des expressions complexes. Impressions:
    *** Script: c: 1
    *** Script: gr.related_incidents: 1
    *** Script: 2
    *** Script: 3
    Amélioration de la clarté, mais toujours autorisée sur les variables (var, let, const). Impressions:
    sn_es5: c: 0
    sn_es5: gr.related_incidents: 1
    sn_es5: 1
    sn_es5: 2
    La même chose que ES5, avec des règles plus strictes dans certains contextes (par exemple, const).
    Continuations de lignes Autorisé avec une barre oblique inverse (\) mais déconseillé en raison de problèmes de lisibilité. Dans cet exemple, les trois fonctions sont appelées.
    var expr = doFoo();  // do foo
               doBar();  // do bar 
               finish();   // all done
     eval(expr);
    
    Identique au mode de compatibilité ; Aucun changement dans la gestion des continuations de ligne. Dans l’exemple précédent, ES5 n’appelle que la première fonction et traite tout ce qui suit le premier commentaire, y compris la nouvelle ligne, comme un commentaire jusqu’à la fin de l’expression. C’est la même chose que ES5, mais les littéraux de modèle offrent une alternative plus lisible.
    Points-virgules manquants L’insertion automatique de points-virgules (ASI) conduisait souvent à un comportement inattendu. Lève une erreur de syntaxe lorsqu’un point-virgule est manquant. Identique à ES5. Les pratiques mises à jour encouragent les points-virgules explicites.
    Fonctions inexistantes L’appel d’une fonction inexistante lève une ReferenceError. Lève une TypeError si une non-fonction est appelée. Lève une EcmaError lorsqu’une fonction inexistante est appelée ou qu’une propriété est référencée.
    Propriétés inexistantes L’accès à une propriété inexistante renvoie un nombre indéfini ; Aucune erreur n’a été générée. Identique à pré-ES5. Identique au mode Compatibilité et au mode ES5 Standards.
    Littéraux numériques Littéraux décimaux et hexadécimaux de base. Introduction de règles d’analyse plus strictes et d’une meilleure gestion des littéraux numériques. Ajout de littéraux binaires (0b), octaux (0o) et BigInt (123n).
    Mot clé réservé en tant que propriété L’utilisation de mots clés réservés n’est pas possible. Les mots-clés réservés peuvent être utilisés comme noms de propriétés sans erreur, par exemple, obj.for. Imprime l’objet lorsqu’il est renvoyé. Identique à ES5.
    Traiter let et yield comme des mots clés let et yield ne sont pas des mots-clés et ne peuvent être utilisés que comme identifiants. let est présenté comme un mot-clé. Le rendement est réservé en mode strict. Les deux sont des mots-clés. Les utiliser comme identificateurs entraîne des erreurs de syntaxe.