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:
<!-- 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
, wobeiX
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, woX
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 diearguments.callee
-Eigenschaft sind veraltet und im strikten Modus nicht verfügbar. - Statt
arguments
als Eigenschaft einer Funktion zuzugreifen, sollten Sie dasarguments
-Objekt innerhalb von Funktionsabschlüssen verwenden.
Objekt
- Die
Object.prototype.__proto__
-Zugriffe sind veraltet. Verwenden Sie stattdessenObject.getPrototypeOf
undObject.setPrototypeOf
. Dies gilt nicht für den literalen Schlüssel__proto__
in objektliteralen. - Die Methoden
Object.prototype.__defineGetter__
,Object.prototype.__defineSetter__
,Object.prototype.__lookupGetter__
undObject.prototype.__lookupSetter__
sind veraltet. Verwenden Sie stattdessenObject.getOwnPropertyDescriptor
undObject.defineProperty
.
String
- HTML-Wrapper-Methoden wie
String.prototype.fontsize
undString.prototype.big
. String.prototype.substr
wird wahrscheinlich nicht bald entfernt, aber es ist in Annex B definiert und daher normativ optional.String.prototype.trimLeft
undString.prototype.trimRight
sollten durchString.prototype.trimStart
undString.prototype.trimEnd
ersetzt werden.
Datum
- Die Methoden
getYear()
undsetYear()
sind vom Jahr-2000-Problem betroffen und wurden durchgetFullYear
undsetFullYear
ersetzt. - Die Methode
toGMTString()
ist veraltet. Verwenden Sie stattdessentoUTCString()
.
Escape-Sequenzen
- Oktal-Escape-Sequenzen (\ gefolgt von einer, zwei oder drei oktalen Ziffern) sind in Zeichen- und regulären Ausdrucksliteralen veraltet.
- Die Funktionen
escape()
undunescape()
sind veraltet. Verwenden SieencodeURI()
,encodeURIComponent()
,decodeURI()
oderdecodeURIComponent()
, um Escape-Sequenzen für Sonderzeichen zu kodieren und dekodieren.
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.
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 stattdessenlength
.
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 anString.prototype
zusammen mitFunction.call
verwenden. String.prototype.quote
wurde aus Firefox 37 entfernt.- Nicht-standardisierter
flags
-Parameter inString.prototype.search
,String.prototype.match
undString.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 einerWeakMap
zu durchlaufen.
Datum
Date.prototype.toLocaleFormat()
, welches einen Formatstring im gleichen Format wie diestrftime()
-Funktion in C verwendete, ist obsolet. Verwenden SietoLocaleString()
oderIntl.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 anArray.prototype
zusammen mitFunction.call
verwenden.
Nummer
Number.toInteger()
ist obsolet. Verwenden Sie stattdessenMath.floor
,Math.round
oder andere Methoden.
Proxy
Proxy.create
undProxy.createFunction
sind obsolet. Verwenden Sie denProxy()
-Konstruktor statt.- Die folgenden "traps" sind obsolet:
hasOwn
(bug 980565, Firefox 33).getEnumerablePropertyKeys
(bug 783829, Firefox 37)getOwnPropertyNames
(bug 1007334, Firefox 33)keys
(bug 1007334, Firefox 33)
ParallelArray
ParallelArray
ist obsolet.
Anweisungen
for each...in
ist obsolet. Verwenden Siefor...of
.- Let-Blöcke und Let-Ausdrücke sind obsolet.
- Ausdrucksclosures (
function () 1
als Abkürzung fürfunction () { return 1; }
) sind obsolet. Verwenden Sie reguläreFunktionen
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.
// 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 dervalue
-Eigenschaft desIteratorResult
-Objekts. - Die Iterationsbeendigung wurde durch Werfen eines
StopIteration
-Objekts ausgedrückt, statt durch diedone
-Eigenschaft desIteratorResult
-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.