Considérations relatives au changement de mode JavaScript

  • Rversion finale: Xanadu
  • Mis à jour 1 août 2024
  • 3 minutes de lecture
  • Le changement du mode JavaScript d’une application ou d’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, consultez Modes JavaScript et Prise en charge des fonctionnalités du moteur JavaScript.

    Ce tableau met en évidence l’évolution du comportement JavaScript 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 dans les modes 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 des 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, ce qui provoque un comportement inattendu. Les booléens primitifs sont mieux 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 les 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 = '
    Le même 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 diminuer Autorisé sur les variables, mais peut se comporter de manière 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é sur les variables (var, let, const). Impressions:
    sn_es5: c: 0
    sn_es5: gr.related_incidents: 1
    sn_es5: 1
    sn_es5: 2
    Identique à ES5, avec des règles plus strictes dans certains contextes (par exemple, const).
    Continuations de la ligne 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é ; Pas de changement dans les continuations de ligne de manutention. 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 le saut de ligne, comme un commentaire jusqu’à la fin de l’expression. Identique à ES5, mais les littéraux de modèle offrent une alternative plus lisible.
    Point-virgules manquants L’insertion automatique d’un point-virgule (ASI) entraînait souvent des comportements inattendus. Génère 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 génère 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 undefined ; Aucune erreur n’a été générée. Identique à la version antérieure ES5. Identique au mode de compatibilité et au mode standard ES5.
    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 des littéraux binaires (0b), octal (0o) et BigInt (123n).
    Mot clé réservé en tant que propriété Il n’est pas possible d’utiliser des mots clés réservés. Les mots-clés réservés peuvent être utilisés comme noms de propriété sans erreur, par exemple, obj.for. Imprime l’objet lorsqu’il est retourné. Identique à ES5.
    Traitez, laissez et céder 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 introduit comme un mot-clé. Le rendement est réservé en mode strict. Les deux sont des mots-clés. Leur utilisation en tant qu’identifiants génère des erreurs de syntaxe.