Veraltete und obsolet Funktionen

Diese Seite listet Funktionen von JavaScript auf, die veraltet sind (d.h. noch verfügbar, aber zur Entfernung geplant) und obsolet sind (d.h. nicht mehr verwendbar).

Veraltete Funktionen

Diese veralteten Funktionen können noch genutzt werden, sollten jedoch mit Vorsicht verwendet werden, da sie nicht zwingend von jedem JavaScript-Interpreter implementiert werden müssen. Sie sollten daran arbeiten, ihre Verwendung aus Ihrem Code zu entfernen.

Einige dieser veralteten Funktionen sind im Annex B der ECMAScript-Spezifikation aufgeführt. Dieser Abschnitt wird als normativ optional beschrieben – das heißt, Web-Browser müssen diese Funktionen implementieren, während Nicht-Web-Hosts dies nicht tun müssen. Diese Funktionen sind wahrscheinlich stabil, da ihre Entfernung zu Rückwärtskompatibilitätsproblemen führen und alte Websites brechen würde. (JavaScript hat das Designziel "das Netz nicht zu brechen".) Dennoch sind sie nicht plattformübergreifend tragbar und werden möglicherweise nicht von allen Analysewerkzeugen unterstützt. Daher wird empfohlen, sie nicht zu verwenden, wie die Einleitung von Annex B besagt:

… Alle im Anhang spezifizierten Sprachfunktionen und Verhaltensweisen haben ein oder mehrere unerwünschte Merkmale und würden ohne Anwesenheit eines Erbespektrums aus dieser Spezifikation entfernt werden. …

… Programmierer sollten diese Funktionen und Verhaltensweisen nicht nutzen oder deren Existenz beim Schreiben von ECMAScript-Code annehmen. …

Einige andere, obwohl sie im Hauptteil der Spezifikation stehen, sind ebenfalls als normativ optional markiert und sollten nicht vorausgesetzt werden.

HTML Kommentare

JavaScript-Quelltext, wenn als Skripte geparst, erlaubt HTML-ähnliche Kommentare, als ob das Skript Teil eines <script>-Tags wäre.

Das Folgende ist gültiges JavaScript, wenn es in einem Webbrowser (oder Node.js, welches die V8 Engine von Chrome nutzt) ausgeführt wird:

js
<!-- comment
console.log("a"); <!-- another comment
console.log("b");
--> More comment
// Logs "a" and "b"

<!-- und --> wirken beide wie //, d.h. sie starten Zeilenkommentare. --> ist nur am Zeilenanfang gültig (um Mehrdeutigkeiten mit einem postfaktischen Dekrement gefolgt von einem Größer-als-Operator zu vermeiden), während <!-- überall in der Zeile vorkommen kann.

RegExp

Die folgenden Eigenschaften sind veraltet. Dies betrifft nicht ihre Verwendung in Ersetzungsstrings:

$1–$9

Klammerausdrücke, falls vorhanden.

input, $_

Der String, gegen den ein regulärer Ausdruck abgeglichen wird.

lastMatch, $&

Der zuletzt gefundene Teilstring.

lastParen, $+

Der letzte Klammerausdruck, falls vorhanden.

leftContext, $`

Der Teilstring vor dem aktuellsten Treffer.

rightContext, $'

Der Teilstring nach dem aktuellsten Treffer.

Warnung: Vermeiden Sie die Verwendung dieser statischen Eigenschaften, da sie Probleme bei der Interaktion mit externem Code verursachen können!

Die compile()-Methode ist veraltet. Erstellen Sie stattdessen eine neue Instanz von RegExp.

Folgende Regex-Syntaxen sind veraltet und nur im Unicode-unabhängigen Modus verfügbar. Im Unicode-bewussten Modus sind sie alle Syntaxfehler:

  • Lookahead-Aussagen können Quantifizierer haben.
  • Backreferences, die sich nicht auf eine existierende Fanggruppe beziehen, werden zu veralteten Oktal-Escape-Sequenzen.
  • In Zeichenklassen wird das -, wenn ein Grenzwert eine Zeichenklasse ist, zu einem literalen Zeichen.
  • Eine nicht erkannte Escape-Sequenz wird zu einem "Identity-Escape".
  • Escape-Sequenzen innerhalb von Zeichenklassen der Form \cX, wobei X eine Zahl oder _ ist, werden auf die gleiche Weise dekodiert wie die mit ASCII-Buchstaben: \c0 ist das gleiche wie \cP bei modulo 32. Darüber hinaus, wenn das Format \cX angetroffen wird, wo X keiner der anerkannten Zeichen ist, wird der Backslash als literales Zeichen behandelt.
  • Die Sequenz \k innerhalb eines Regex, das keine benannten Fanggruppen hat, wird als Identity-Escape behandelt.
  • Die Syntaxzeichen ], { und } können buchstäblich ohne Escape erscheinen, wenn sie nicht als Ende einer Zeichenklasse oder Quantifizierer-Begrenzer interpretiert werden können.

Funktion

  • Die caller-Eigenschaft von Funktionen und die arguments.callee-Eigenschaft sind veraltet und im strikten Modus nicht verfügbar.
  • Statt arguments als Eigenschaft einer Funktion zuzugreifen, sollten Sie das arguments-Objekt innerhalb von Funktionsabschlüssen verwenden.

Objekt

String

Datum

Escape-Sequenzen

Anweisungen

Die with-Anweisung ist veraltet und im strikten Modus nicht verfügbar.

Initialisierer in var-Deklarationen von Kopfzeilen der for...in-Schleifen sind veraltet und erzeugen Syntaxfehler im strikten Modus. Der Initialisierungsausdruck wird ausgewertet und der Variable zugewiesen, aber der Wert würde unmittelbar bei der ersten Iteration der Schleife neuzugewiesen.

Normalerweise kann der catch-Block einer try...catch-Anweisung keine Variablendeklaration mit demselben Namen enthalten wie die im catch() gebundenen Variablen. Eine Erweiterungsgrammatik erlaubt, dass der catch-Block eine var-deklarierte Variable mit dem gleichen Namen wie die catch-gebundene Bezeichnung enthält, aber nur, wenn die catch-Bindung eine einfache Bezeichnung ist, kein Destrukturierungsmuster. Trotzdem würde die Initialisierung und Zuweisung dieser Variablen nur auf die catch-gebundene Bezeichnung wirken, anstatt auf die Variable der übergeordneten Ebene, was verwirrend sein könnte.

js
var a = 2;
try {
  throw 42;
} catch (a) {
  var a = 1; // This 1 is assigned to the caught `a`, not the outer `a`.
}
console.log(a); // 2

try {
  throw 42;
  // Note: identifier changed to `err` to avoid conflict with
  // the inner declaration of `a`.
} catch (err) {
  var a = 1; // This 1 is assigned to the upper-scope `a`.
}
console.log(a); // 1

Dies ist in Annex B der Spezifikation aufgeführt und daher möglicherweise nicht überall implementiert. Vermeiden Sie jegliche Namenskonflikte zwischen der catch-gebundenen Bezeichnung und Variablen, die im catch-Block deklariert sind.

Obsolete Funktionen

Diese obsoleten Funktionen wurden vollständig aus JavaScript entfernt und können ab der angegebenen Version von JavaScript nicht mehr verwendet werden.

RegExp

Die folgenden sind nun Eigenschaften von RegExp-Instanzen und nicht länger des RegExp-Konstruktors:

Eigenschaft Beschreibung
global Ob der reguläre Ausdruck gegen alle möglichen Treffer in einem String getestet wird oder nur gegen den ersten.
ignoreCase Ob beim Versuch des Abgleichs in einem String die Groß- und Kleinschreibung ignoriert wird.
lastIndex Der Index, an dem der nächste Abgleich begonnen wird.
multiline (auch über RegExp.$*) Ob auch in mehreren Zeilen nach Übereinstimmungen gesucht wird.
source Der Text des Musters.

Die valueOf()-Methode ist nicht mehr für RegExp spezialisiert. Sie verwendet Object.prototype.valueOf(), was zu sich selbst zurückkehrt.

Funktion

  • Die arity-Eigenschaft von Funktionen ist obsolet. Verwenden Sie stattdessen length.

Objekt

Eigenschaft Beschreibung Alternative
__count__ Gibt die Anzahl der direkt auf einem benutzerdefinierten Objekt vorhandenen aufzählbaren Eigenschaften zurück. Object.keys()
__parent__ Verweist auf den Kontext eines Objekts. Keine direkte Alternative
__iterator__ Wird mit veralteten Iteratoren verwendet. Symbol.iterator und die neuen Iterationsprotokolle
__noSuchMethod__ Eine Methode, die aufgerufen wird, wenn eine nicht existierende Eigenschaft als Methode aufgerufen wird. Proxy
Object.prototype.eval() Wertet einen JavaScript-Code-String im Kontext des angegebenen Objekts aus. Keine direkte Alternative
Object.observe() Asynchrones Beobachten von Änderungen an einem Objekt. Proxy
Object.unobserve() Entfernt Beobachter. Proxy
Object.getNotifier() Erzeugt ein Notifikator-Objekt, das ermöglicht, eine Änderung mit Object.observe() synthetisch auszulösen. Keine direkte Alternative
Object.prototype.watch() Befestigt einen Callback-Handler an eine Eigenschaft, der aufgerufen wird, wenn die Eigenschaft zugewiesen wird. Proxy
Object.prototype.unwatch() Entfernt Überwachungs-Handler an einer Eigenschaft. Proxy

String

  • Nicht-standardisierte generische String-Methoden wie String.slice(myStr, 0, 12), String.replace(myStr, /\./g, "!") usw. wurden in Firefox 1.5 (JavaScript 1.6) eingeführt, in Firefox 53 veraltet und in Firefox 68 entfernt. Sie können Methoden an String.prototype zusammen mit Function.call verwenden.
  • String.prototype.quote wurde aus Firefox 37 entfernt.
  • Nicht-standardisierter flags-Parameter in String.prototype.search, String.prototype.match und String.prototype.replace sind obsolet.

WeakMap

  • WeakMap.prototype.clear() wurde in Firefox 20 hinzugefügt und in Firefox 46 entfernt. Es ist nicht möglich, alle Schlüssel in einer WeakMap zu durchlaufen.

Datum

  • Date.prototype.toLocaleFormat(), welches einen Formatstring im gleichen Format wie die strftime()-Funktion in C verwendete, ist obsolet. Verwenden Sie toLocaleString() oder Intl.DateTimeFormat stattdessen.

Array

  • Nicht standardmäßige generische Array-Methoden wie Array.slice(myArr, 0, 12), Array.forEach(myArr, myFn) usw. wurden in Firefox 1.5 (JavaScript 1.6) eingeführt, in Firefox 68 veraltet und in Firefox 71 entfernt. Sie können Methoden an Array.prototype zusammen mit Function.call verwenden.
Eigenschaft Beschreibung Alternative
Array.observe() Asynchrones Beobachten von Array-Änderungen. Proxy
Array.unobserve() Entfernt Beobachter. Proxy

Nummer

  • Number.toInteger() ist obsolet. Verwenden Sie stattdessen Math.floor, Math.round oder andere Methoden.

Proxy

  • Proxy.create und Proxy.createFunction sind obsolet. Verwenden Sie den Proxy()-Konstruktor statt.
  • Die folgenden "traps" sind obsolet:

ParallelArray

  • ParallelArray ist obsolet.

Anweisungen

  • for each...in ist obsolet. Verwenden Sie for...of.
  • Let-Blöcke und Let-Ausdrücke sind obsolet.
  • Ausdrucksclosures (function () 1 als Abkürzung für function () { return 1; }) sind obsolet. Verwenden Sie reguläre Funktionen oder Pfeilfunktionen.

Erwerb von Quelltext

Die toSource()-Methoden von Arrays, Nummern, Zeichenfolgen usw. und die globale Funktion uneval() sind obsolet. Verwenden Sie toString(), oder schreiben Sie Ihre eigene Serialisierungsmethode.

Veraltete Generator- und Iteratorprotokolle

Veraltete Generatorfunktionsanweisungen und veraltete Generatorfunktionsausdrücke sind entfernt. Die alte Generatorfunktion-Syntax wiederverwendet das function-Schlüsselwort, welches automatisch zu einer Generatorfunktion wird, wenn es ein oder mehrere yield-Ausdrücke im Body gibt – dies ist nun ein Syntaxfehler. Verwenden Sie function*-Anweisungen und function*-Ausdrücke.

Array-Komprimitierungen und Generator-Komprimitierungen sind entfernt.

js
// Legacy array comprehensions
[for (x of iterable) x]
[for (x of iterable) if (condition) x]
[for (x of iterable) for (y of iterable) x + y]

// Legacy generator comprehensions
(for (x of iterable) x)
(for (x of iterable) if (condition) x)
(for (x of iterable) for (y of iterable) x + y)

Firefox hat vor Version 26 ein weiteres Iteratorprotokoll implementiert, das dem Standard-Iteratorprotokoll ähnlich ist. Ein Objekt ist ein veralteter Iterator, wenn es eine next()-Methoden implementiert, die bei jedem Aufruf einen Wert erzeugt und am Ende der Iteration ein StopIteration-Objekt wirft. Dieses veraltete Iteratorprotokoll unterscheidet sich vom Standard-Iteratorprotokoll:

  • Der Wert wurde direkt als Rückgabewert der Aufrufe von next() zurückgegeben, anstatt der value-Eigenschaft des IteratorResult-Objekts.
  • Die Iterationsbeendigung wurde durch Werfen eines StopIteration-Objekts ausgedrückt, statt durch die done-Eigenschaft des IteratorResult-Objekts.

Diese Funktion, zusammen mit dem globalen Konstruktor StopIteration, wurde in Firefox 58+ entfernt. Für zukunftsorientierte Verwendungen sollten Sie for...of-Schleifen und das Iteratorprotokoll in Betracht ziehen.

Scharfe Variablen

Scharfe Variablen sind obsolet. Um zirkuläre Strukturen zu erstellen, verwenden Sie stattdessen temporäre Variablen.