Fonctionnalités dépréciées et obsolètes
Cette page liste les fonctionnalités de JavaScript qui sont dépréciées (c'est-à-dire encore disponibles mais prévues pour être supprimées) et obsolètes (c'est-à-dire plus utilisables).
Fonctionnalités dépréciées
Ces fonctionnalités dépréciées peuvent encore être utilisées, mais doivent être utilisées avec prudence car elles ne sont pas obligatoirement implémentées par tous les moteurs JavaScript. Vous devriez travailler à les supprimer de votre code.
Certaines de ces fonctionnalités dépréciées sont listées dans la section Annexe B (angl.) de la spécification ECMAScript. Cette section est décrite comme normative optionnelle — c'est-à-dire que les navigateurs web doivent implémenter ces fonctionnalités, tandis que les hôtes non web peuvent ne pas le faire. Ces fonctionnalités sont probablement stables car les supprimer provoquerait des problèmes de compatibilité ascendante et casserait les sites web existants. (JavaScript a pour objectif de conception de « ne pas casser le web ».) Cependant, elles ne sont pas portables sur toutes les plateformes et peuvent ne pas être prises en charge par tous les outils d'analyse, il est donc conseillé de ne pas les utiliser, comme l'introduction de l'Annexe B l'indique :
… Toutes les fonctionnalités et tous les comportements du langage décrits dans la présente annexe présentent une ou plusieurs caractéristiques indésirables et, en l'absence d'usage historique, seraient supprimés de la présente spécification. …
… Les programmeur·euse·s ne devraient pas utiliser ou supposer l'existence de ces fonctionnalités et comportements lors de l'écriture de nouveau code ECMAScript. …
Certaines autres, bien que dans le corps principal de la spécification, sont également marquées comme normatives optionnelles et ne devraient pas être utilisées de manière dépendante.
Commentaires HTML
Le code source JavaScript, s'il est analysé comme des scripts, permet des commentaires de type HTML, comme si le script faisait partie d'une balise <script>.
Le code suivant est un JavaScript valide lorsqu'il est exécuté dans un navigateur web (ou Node.js, qui utilise le moteur V8 de Chrome) :
<!-- commentaire
console.log("a"); <!-- un autre commentaire
console.log("b");
--> Plus de commentaires
// Affiche "a" et "b"
<!-- et --> agissent tous deux comme //, c'est-à-dire comme des commentaires sur une ligne. --> n'est valide qu'au début d'une ligne (pour éviter toute ambiguïté avec un décrément postfixé suivi d'un opérateur supérieur), tandis que <!-- peut apparaître n'importe où dans la ligne.
Propriétés de RegExp
Les propriétés suivantes sont dépréciées. Cela n'affecte pas leur utilisation dans les chaînes de caractères de remplacement :
$1-$9-
Sous-chaînes de caractères entre parenthèses, si elles existent.
input,$_-
La chaîne de caractères par rapport à laquelle une expression rationnelle est comparée.
lastMatch,$&-
La dernière sous-chaîne de caractères correspondante.
lastParen,$+-
La dernière sous-chaîne de caractères entre parenthèses, si elle existe.
leftContext,$`-
La sous-chaîne de caractères précédant la correspondance la plus récente.
rightContext,$'-
La sous-chaîne de caractères suivant la correspondance la plus récente.
Attention : Évitez d'utiliser ces propriétés statiques, car elles peuvent causer des problèmes lors de l'interaction avec du code externe (angl.) !
La méthode compile() est dépréciée. Il est recommandé de créer une nouvelle instance de RegExp à la place.
Les syntaxes regex suivantes sont dépréciées et ne sont disponibles qu'en mode insensible à Unicode. En mode sensible à Unicode, elles sont toutes des erreurs de syntaxe :
- Les assertions en avant peuvent avoir des quantificateurs.
- Les références arrière qui ne se réfèrent pas à un groupe capturant existant deviennent des échappements octaux hérités.
- Dans les classes de caractères, les plages de caractères où une limite est une classe de caractères font que le
-devient un caractère littéral. - Une séquence d'échappement non reconnue devient un « échappement d'identité ».
- Les séquences d'échappement dans les classes de caractères de la forme
\cXoùXest un chiffre ou_sont décodées de la même manière que celles avec des lettres ASCII :\c0est identique à\cPlorsqu'on prend le modulo 32. De plus, si la forme\cXest rencontrée n'importe où oùXn'est pas l'un des caractères reconnus, alors le backslash est traité comme un caractère littéral. - La séquence
\kdans une regex qui n'a pas de groupes capturants nommés est traitée comme un échappement d'identité. - Les caractères de syntaxe
],{, et}peuvent apparaître littéralement sans échappement s'ils ne peuvent pas être interprétés comme la fin d'une classe de caractères ou des délimiteurs de quantificateur.
Propriétés de Function
- La propriété
callerdes fonctions et la propriétéarguments.calleesont dépréciées et indisponibles en mode strict. - Au lieu d'accéder à
argumentsen tant que propriété d'une fonction, vous devez utiliser l'objetargumentsà l'intérieur des fermetures de fonction.
Propriétés et méthodes de Object
- L'accesseur
Object.prototype.__proto__est déprécié. UtilisezObject.getPrototypeOfetObject.setPrototypeOfà la place. Cela ne s'applique pas à la clé littérale__proto__dans les littéraux d'objet. - Les méthodes
Object.prototype.__defineGetter__,Object.prototype.__defineSetter__,Object.prototype.__lookupGetter__etObject.prototype.__lookupSetter__sont dépréciées. UtilisezObject.getOwnPropertyDescriptoretObject.definePropertyà la place.
Propriétés de String
- Les méthodes d'encapsulation HTML comme
String.prototype.fontsizeetString.prototype.bigsont dépréciées. String.prototype.substrne sera probablement pas supprimée de sitôt, mais elle est définie dans l'annexe B et est donc optionnelle sur le plan normatif.String.prototype.trimLeftetString.prototype.trimRightdoivent être remplacés parString.prototype.trimStartetString.prototype.trimEnd.
Méthodes de Date
- Les méthodes
getYear()etsetYear()sont affectées par le problème de l'an 2000 et ont été remplacées pargetFullYear()etsetFullYear(). - La méthode
toGMTString()est dépréciée. UtiliseztoUTCString()à la place.
Séquences d'échappement
- Les séquences d'échappement octales (\ suivies d'un, deux ou trois chiffres octaux) sont dépréciées dans les littéraux de chaînes de caractères et d'expressions régulières.
- Les fonctions
escape()etunescape()sont dépréciées. UtilisezencodeURI(),encodeURIComponent(),decodeURI()oudecodeURIComponent()pour encoder et décoder les séquences d'échappement des caractères spéciaux.
Instructions
L'instruction with est dépréciée et indisponible en mode strict.
Les initialisateurs dans les déclarations var des en-têtes de boucles for…in sont dépréciés et produisent des erreurs de syntaxe en mode strict. L'expression d'initialisation est évaluée et affectée à la variable, mais la valeur serait immédiatement réaffectée lors de la première itération de la boucle.
Normalement, le bloc catch d'une instruction try…catch ne peut contenir aucune déclaration de variable portant le même nom que les variables liées dans le catch(). Une grammaire étendue permet au bloc catch de contenir une variable déclarée avec var portant le même nom que l'identifiant lié au catch, mais uniquement si la liaison catch est un identifiant simple, et non un modèle de déstructuration. Cependant, l'initialisation et l'affectation de cette variable n'agiraient que sur l'identifiant lié au catch, au lieu de la variable de portée supérieure, et le comportement pourrait être déroutant.
var a = 2;
try {
throw new Error();
} catch (a) {
var a = 1; // Cette valeur 1 est affectée à `a` qui est attrapé, pas au `a` extérieur.
}
console.log(a); // 2
try {
throw new Error();
// Note : l'identifiant a été changé en `err` pour éviter le conflit
// avec la déclaration interne de `a`.
} catch (err) {
var a = 1; // Cette valeur 1 est affectée à `a` de la portée supérieure.
}
console.log(a); // 1
Cela est répertorié dans l'annexe B de la spécification et peut donc ne pas être implémenté partout. Évitez tout conflit de noms entre l'identifiant lié au catch et les variables déclarées dans le bloc catch.
Fonctionnalités obsolètes
Ces fonctionnalités obsolètes ont été entièrement supprimées de JavaScript et ne peuvent plus être utilisées à partir de la version indiquée de JavaScript.
Propriétés de RegExp
Les éléments suivants sont désormais des propriétés des instances de RegExp, et non plus du constructeur RegExp :
| Propriété | Description |
|---|---|
global |
Indique si l'expression régulière doit être testée contre toutes les correspondances possibles dans une chaîne, ou seulement contre la première. |
ignoreCase |
Indique si la casse doit être ignorée lors de la tentative de correspondance dans une chaîne. |
lastIndex |
L'index à partir duquel commencer la prochaine correspondance. |
multiline (également via RegExp.$*) |
Indique si la recherche doit s'effectuer sur plusieurs lignes. |
source |
Le texte du motif. |
La méthode valueOf() n'est plus spécialisée pour RegExp. Elle utilise Object.prototype.valueOf(), qui renvoie elle-même.
Propriétés de Function
- La propriété
aritydes fonctions est obsolète. Utilisezlengthà la place.
Propriétés de Object
| Propriété | Description | Alternative |
|---|---|---|
__count__ |
Retourne le nombre de propriétés énumérables directement sur un objet défini par l'utilisateur·ice. | Object.keys() |
__parent__ |
Pointe vers le contexte d'un objet. | Pas de remplacement direct |
__iterator__ |
Utilisé avec les itérateurs hérités. | Symbol.iterator et les nouveaux protocoles d'itération |
__noSuchMethod__ |
Une méthode appelée lorsqu'une propriété inexistante est appelée en tant que méthode. | Proxy |
Object.prototype.eval() |
Évalue une chaîne de code JavaScript dans le contexte de l'objet défini. | Pas de remplacement direct |
Object.observe() |
Observation asynchrone des changements d'un objet. | Proxy |
Object.unobserve() |
Supprime les observateurs. | Proxy |
Object.getNotifier() |
Crée un objet notificateur qui permet de déclencher de manière synthétique un changement observable avec Object.observe(). |
Pas de remplacement direct |
Object.prototype.watch() |
Attache un gestionnaire de fonction de rappel à une propriété qui est appelé lorsque la propriété est assignée. | Proxy |
Object.prototype.unwatch() |
Supprime les gestionnaires de surveillance sur une propriété. | Proxy |
Méthodes de String
- Les méthodes génériques non standard de
StringcommeString.slice(myStr, 0, 12),String.replace(myStr, /\./g, "!"), etc. ont été introduites dans Firefox 1.5 (JavaScript 1.6), dépréciées dans Firefox 53 et supprimées dans Firefox 68. Vous pouvez utiliser les méthodes surString.prototypeavecFunction.call()à la place. String.prototype.quotea été supprimé dans Firefox 37.- Le paramètre non standard
flagsdansString.prototype.search,String.prototype.match, etString.prototype.replaceest obsolète.
Méthodes de WeakMap
WeakMap.prototype.clear()a été ajouté dans Firefox 20 et supprimé dans Firefox 46. Il n'est pas possible de parcourir toutes les clés dans unWeakMap.
Méthodes de Date
Date.prototype.toLocaleFormat(), qui utilisait une chaîne de caractères de format dans le même format attendu par la fonctionstrftime()en C, est obsolète. UtiliseztoLocaleString()ouIntl.DateTimeFormatà la place.
Méthodes de Array
- Les méthodes génériques non standard de
ArraycommeArray.slice(myArr, 0, 12),Array.forEach(myArr, myFn), etc. ont été introduites dans Firefox 1.5 (JavaScript 1.6), dépréciées dans Firefox 68 et supprimées dans Firefox 71. Vous pouvez utiliser les méthodes surArray.prototypeavecFunction.call()à la place.
Méthodes de Number
Number.toInteger()est obsolète. UtilisezMath.floor(),Math.round(), ou d'autres méthodes à la place.
Méthodes de Proxy
Proxy.create()etProxy.createFunction()sont obsolètes. Utilisez le constructeurProxy()à la place.- Les pièges suivants sont obsolètes :
hasOwn(bogue 980565 (angl.), Firefox 33).getEnumerablePropertyKeys(bogue 783829 (angl.), Firefox 37)getOwnPropertyNames(bogue 1007334 (angl.), Firefox 33)keys(bogue 1007334 (angl.), Firefox 33)
L'objet ParallelArray
ParallelArrayest obsolète.
Instructions
for each...inest obsolète. Utilisezfor...ofà la place.- Les blocs
letet les expressionsletsont obsolètes. - Les closures d'expression (
function () 1comme raccourci defunction () { return 1; }) sont obsolètes. Utilisez desfunctionrégulières ou des fonctions fléchées à la place.
Acquisition du texte source
Les méthodes toSource() des tableaux, nombres, chaînes de caractères, etc. et la fonction globale uneval() sont obsolètes. Utilisez toString(), ou écrivez votre propre méthode de sérialisation à la place.
Générateurs et itérateurs hérités
Les instructions de fonction génératrice héritée et les expressions de fonction génératrice héritée sont supprimées. La syntaxe de fonction génératrice héritée réutilise le mot-clé function, qui devient automatiquement une fonction génératrice lorsqu'il y a une ou plusieurs expressions yield dans le corps — c'est maintenant une erreur de syntaxe. Utilisez les instructions function* et les expressions function* à la place.
Les compréhensions de tableau et les compréhensions de générateur sont supprimées.
// Compréhensions de tableau héritées
[for (x of iterable) x]
[for (x of iterable) if (condition) x]
[for (x of iterable) for (y of iterable) x + y]
// Compréhensions de générateur héritées
(for (x of iterable) x)
(for (x of iterable) if (condition) x)
(for (x of iterable) for (y of iterable) x + y)
Firefox, avant la version 26, a implémenté un autre protocole d'itérateur similaire au protocole d'itération standard. Un objet est un itérateur héritée lorsqu'il implémente une méthode next(), qui produit une valeur à chaque appel et lance un objet StopIteration à la fin de l'itération. Ce protocole d'itérateur héritée diffère du protocole d'itérateur standard :
- La valeur était retournée directement comme valeur de retour des appels à
next(), au lieu de la propriétévaluede l'objetIteratorResult. - La fin de l'itération était exprimée en lançant un objet
StopIteration, au lieu d'utiliser la propriétédonede l'objetIteratorResult.
Cette fonctionnalité, ainsi que le constructeur global StopIteration, ont été supprimés dans Firefox 58+. Pour les utilisations futures, envisagez d'utiliser les boucles for…of et le protocole d'itération.
Variables dièze
Les variables dièze sont obsolètes. Pour créer des structures circulaires, utilisez plutôt des variables temporaires.