Veraltete und obsolet gewordene Funktionen
Diese Seite listet JavaScript-Funktionen auf, die als veraltet (d.h. noch verfügbar, aber für die Entfernung geplant) und obsolet (d.h. nicht mehr nutzbar) gelten.
Veraltete Funktionen
Diese veralteten Funktionen können noch verwendet werden, sollten jedoch mit Vorsicht verwendet werden, da sie nicht in allen JavaScript-Engines implementiert sein müssen. Sie sollten daran arbeiten, deren Verwendung aus Ihrem Code zu entfernen.
Einige dieser veralteten Funktionen sind im Abschnitt Anhang B der ECMAScript-Spezifikation aufgeführt. Dieser Abschnitt wird als normativ optional beschrieben — das heißt, Webbrowser-Hosts müssen diese Funktionen implementieren, während Nicht-Web-Hosts dies möglicherweise nicht tun. Diese Funktionen sind wahrscheinlich stabil, da deren Entfernung Rückwärtskompatibilitätsprobleme verursachen und ältere Websites beeinträchtigen würde. (JavaScript hat das Designziel "das Web nicht kaputt machen".) Dennoch sind sie nicht plattformübergreifend tragbar und werden möglicherweise nicht von allen Analysetools unterstützt, daher wird geraten, sie nicht zu verwenden, wie die Einführung von Anhang B bemerkt:
… Alle in diesem Anhang spezifizierten Sprachmerkmale und Verhaltensweisen weisen eine oder mehrere unerwünschte Eigenschaften auf und würden ohne die Existenz von Altnutzungen aus dieser Spezifikation entfernt werden. …
… Programmierer sollten diese Merkmale und Verhaltensweisen beim Schreiben neuen ECMAScript-Codes nicht verwenden oder deren Existenz voraussetzen. …
Einige andere, obwohl sie sich im Hauptteil der Spezifikation befinden, sind ebenfalls als normativ optional gekennzeichnet und sollten nicht als gegeben vorausgesetzt werden.
HTML-Kommentare
JavaScript-Quellcode, wenn er als Skripte geparst wird, erlaubt HTML-ähnliche Kommentare, als ob das Skript Teil eines <script> Tags wäre.
Folgendes ist gültiges JavaScript, wenn es in einem Webbrowser (oder Node.js, das 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 --> verhalten sich beide wie //, d.h. sie starten Zeilenkommentare. --> ist nur am Anfang einer Zeile gültig (um Verwirrung mit einem Postfix-Abzugsoperator gefolgt von einem Größer-als-Operator zu vermeiden), während <!-- überall in der Zeile vorkommen kann.
RegExp
Die folgenden Eigenschaften sind veraltet. Dies beeinflusst nicht ihre Verwendung in Ersatz-Strings:
$1–$9-
Eingeschlossene Substring-Übereinstimmungen, falls vorhanden.
input,$_-
Der String, gegen den ein regulärer Ausdruck abgeglichen wird.
lastMatch,$&-
Der zuletzt abgeglichene Substring.
lastParen,$+-
Die zuletzt eingeschlossene Substring-Übereinstimmung, falls vorhanden.
leftContext,$`-
Der Substring, der der letzten Übereinstimmung vorausgeht.
rightContext,$'-
Der Substring, der der letzten Übereinstimmung folgt.
Warnung: Vermeiden Sie die Verwendung dieser statischen Eigenschaften, da sie Probleme im Umgang mit externem Code verursachen können!
Die Methode compile() ist veraltet. Erstellen Sie stattdessen eine neue RegExp-Instanz.
Die folgenden Regex-Syntaxen sind veraltet und nur im Unicode-unaware Modus verfügbar. Im Unicode-aware Modus sind sie alle Syntaxfehler:
- Lookahead assertions können Quantifier haben.
- Backreferences, die sich nicht auf eine existierende Erfassungsgruppe beziehen, werden zu Legacy-Oktalescape-sequenzen.
- In Zeichenklassen, Zeichenbereiche, bei denen eine Grenze eine Zeichenklasse ist, machen das
-zu einem literalen Zeichen. - Eine Escape-Sequenz, die nicht erkannt wird, wird zu einem "Identitäts-Escape".
- Escape-Sequenzen innerhalb von Zeichenklassen der Form
\cX, wobeiXeine Zahl oder_ist, werden auf die gleiche Weise decodiert wie diejenigen mit ASCII-Buchstaben:\c0ist genauso wie\cP, wenn mod 32 genommen wird. Außerdem, wenn die Form\cXirgendwo auftritt, woXnicht eines der erkannten Zeichen ist, wird der Backslash als ein literales Zeichen behandelt. - Die Sequenz
\kinnerhalb eines Regexes, der keine benannten Erfassungsgruppen hat, wird als ein Identitäts-Escape betrachtet. - Die Syntaxzeichen
],{, und}können literal unescaped erscheinen, wenn sie nicht als Ende einer Zeichenklasse oder als Quantifizierer-Delimitatoren interpretiert werden können.
Function
- Die
caller-Eigenschaft von Funktionen und diearguments.callee-Eigenschaft sind veraltet und in strengem Modus nicht verfügbar. - Anstelle des Zugriffs auf
argumentsals Eigenschaft einer Funktion sollten Sie dasarguments-Objekt innerhalb von Funktionsabschlüssen verwenden.
Object
- Die
Object.prototype.__proto__-Zugriffsmethoden sind veraltet. Verwenden Sie stattdessenObject.getPrototypeOfundObject.setPrototypeOf. Dies gilt nicht für den__proto__literal key in Objektliteralen. - Die Methoden
Object.prototype.__defineGetter__,Object.prototype.__defineSetter__,Object.prototype.__lookupGetter__, undObject.prototype.__lookupSetter__sind veraltet. Verwenden Sie stattdessenObject.getOwnPropertyDescriptorundObject.defineProperty.
String
- HTML-Hüllmethoden wie
String.prototype.fontsizeundString.prototype.big. String.prototype.substrwird wahrscheinlich nicht in absehbarer Zeit entfernt, aber es ist in Anhang B definiert und daher normativ optional.String.prototype.trimLeftundString.prototype.trimRightsollten durchString.prototype.trimStartundString.prototype.trimEndersetzt werden.
Date
- Die Methoden
getYear()undsetYear()sind vom Jahr-2000-Problem betroffen und wurden durchgetFullYearundsetFullYearersetzt. - Die Methode
toGMTString()ist veraltet. Verwenden Sie stattdessentoUTCString().
Escape-Sequenzen
- Oktalescape-Sequenzen (\ gefolgt von einer, zwei oder drei oktalen Ziffern) sind in string und regulären Ausdrucks-Literalen veraltet.
- Die Funktionen
escape()undunescape()sind veraltet. Verwenden SieencodeURI(),encodeURIComponent(),decodeURI(), oderdecodeURIComponent(), um Escape-Sequenzen für Sonderzeichen zu kodieren und zu dekodieren.
Anweisungen
Die with-Anweisung ist veraltet und im strengen Modus nicht verfügbar.
Initialisierer in var-Deklarationen von for...in-Schleifen sind veraltet und erzeugen Syntaxfehler im strengen Modus. Die Initialisiererausdrücke werden ausgewertet und der Variablen zugeordnet, aber der Wert würde bei der ersten Schleifeniteration sofort neu zugeordnet werden.
Normalerweise kann der catch-Block einer try...catch-Anweisung keine Variablendeklaration mit dem gleichen Namen enthalten wie die im catch() gebundenen Variablen. Eine erweiterte Grammatik erlaubt es dem catch-Block, eine mit var deklarierte Variable mit dem gleichen Namen wie der im catch gebundene Bezeichner zu enthalten, aber nur, wenn die catch-Bindung ein einfacher Bezeichner ist und kein Destructuring-Muster. Diese Variable wird jedoch nur auf den im catch gebundenen Bezeichner initialisiert und zugewiesen, anstatt auf die oberste Gültigkeitsbereichsvariable, und das Verhalten könnte verwirrend sein.
var a = 2;
try {
throw new Error();
} catch (a) {
var a = 1; // This 1 is assigned to the caught `a`, not the outer `a`.
}
console.log(a); // 2
try {
throw new Error();
// 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 im Anhang B der Spezifikation aufgeführt und daher möglicherweise nicht überall implementiert. Vermeiden Sie Namenskonflikte zwischen dem im catch gebundenen Bezeichner 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 jetzt Eigenschaften von RegExp-Instanzen, nicht mehr des RegExp-Konstruktors:
| Eigenschaft | Beschreibung |
|---|---|
global |
Ob der reguläre Ausdruck gegen alle möglichen Übereinstimmungen in einem String getestet wird oder nur gegen die erste. |
ignoreCase |
Ob beim Versuch einer Übereinstimmung in einem String die Groß-/Kleinschreibung ignoriert wird. |
lastIndex |
Der Index, bei dem mit dem nächsten Abgleich begonnen werden soll. |
multiline (auch über RegExp.$*) |
Ob in String-Übereinstimmungen über mehrere Zeilen hinweg gesucht werden soll. |
source |
Der Text des Musters. |
Die Methode valueOf() ist nicht mehr speziell für RegExp. Sie nutzt Object.prototype.valueOf(), das sich selbst zurückgibt.
Function
- Die
arity-Eigenschaft von Funktionen ist obsolet. Verwenden Sie stattdessenlength.
Object
| Eigenschaft | Beschreibung | Alternative |
|---|---|---|
__count__ |
Gibt die Anzahl der direkt verfügbaren aufzählbaren Eigenschaften auf einem benutzerdefinierten Objekt zurück. | Object.keys() |
__parent__ |
Verweist auf den Kontext eines Objekts. | Keine direkte Ersatzmethode |
__iterator__ |
Wurde mit Legacy-Iteratoren verwendet. | Symbol.iterator und die neuen Iteration-Protokolle |
__noSuchMethod__ |
Eine Methode, die aufgerufen wird, wenn eine nicht vorhandene Eigenschaft als Methode aufgerufen wird. | Proxy |
Object.prototype.eval() |
Wertet einen JavaScript-Code-String im Kontext des angegebenen Objekts aus. | Keine direkte Ersatzmethode |
Object.observe() |
Asynchrones Beobachten von Änderungen an einem Objekt. | Proxy |
Object.unobserve() |
Entfernt Beobachter. | Proxy |
Object.getNotifier() |
Erzeugt ein Notifier-Objekt, das es ermöglicht, eine Änderungsbeobachtung mit Object.observe() synthetisch auszulösen. |
Keine direkte Ersatzmethode |
Object.prototype.watch() |
Hängt einen Callback-Handler an eine Eigenschaft, der aufgerufen wird, wenn der Eigenschaft zugewiesen wird. | Proxy |
Object.prototype.unwatch() |
Entfernt Watch-Handler von einer Eigenschaft. | Proxy |
String
- Nicht standardisierte String-generische 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 als veraltet erklärt und in Firefox 68 entfernt. Sie können Methoden aufString.prototypezusammen mitFunction.callverwenden. String.prototype.quotewurde in Firefox 37 entfernt.- Nicht standardisierte
flags-Parameter inString.prototype.search,String.prototype.match, undString.prototype.replacesind 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 einemWeakMapzu durchlaufen.
Date
Date.prototype.toLocaleFormat(), das ein Formatstring im gleichen Format verwendete, das von der Funktionstrftime()in C erwartet wird, ist obsolet. Verwenden SietoLocaleString()oderIntl.DateTimeFormat.
Array
- Nicht standardisierte Array-generische 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 als veraltet erklärt und in Firefox 71 entfernt. Sie können Methoden aufArray.prototypezusammen mitFunction.callverwenden.
Number
Number.toInteger()ist obsolet. Verwenden Sie statt dessenMath.floor,Math.roundoder andere Methoden.
Proxy
Proxy.createundProxy.createFunctionsind obsolet. Verwenden Sie denProxy()-Konstruktor.- 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
ParallelArrayist obsolet.
Anweisungen
for each...inist obsolet. Verwenden Siefor...of.- Let-Blöcke und Let-Ausdrücke sind obsolet.
- Ausdrückungsabschlüsse (
function () 1als Kurzform vonfunction () { return 1; }) sind obsolet. Verwenden Sie reguläreFunktionenoder Pfeilfunktionen.
Abrufen des Quelltexts
Die toSource()-Methoden von Arrays, Zahlen, Strings usw. und die globale Funktion uneval() sind obsolet. Verwenden Sie toString(), oder schreiben Sie Ihre eigene Serialisierungsmethode.
Legacy-Generator und -Iterator
Legacy-Generator-Funktionsanweisungen und Legacy-Generator-Funktionsausdrücke sind entfernt. Die Syntax der Legacy-Generator-Funktion verwendet das function-Schlüsselwort, das automatisch zu einer Generator-Funktion wird, wenn es eine oder mehrere yield-Ausdrücke im Körper gibt — dies ist jetzt ein Syntaxfehler. Verwenden Sie function*-Anweisungen und function*-Ausdrücke anstelle dessen.
Array-Konstruktionen und Generator-Konstruktionen 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 implementierte vor Version 26 ein weiteres Iterationsprotokoll, das dem Standard Iterators-Protokoll ähnelt. Ein Objekt ist ein Legacy-Iterator, wenn es eine next()-Methode implementiert, die bei jedem Aufruf einen Wert geliefert und ein StopIteration-Objekt am Ende der Iteration ausgelöst hat. Dieses Legacy-Iterator-Protokoll unterscheidet sich vom Standard-Iterator-Protokoll:
- Der Wert wurde direkt als Rückgabewert der
next()-Aufrufe zurückgegeben, anstatt dervalue-Eigenschaft desIteratorResult-Objekts. - Die Beendigung der Iteration wurde durch das Auswerfen eines
StopIteration-Objekts erreicht, anstatt durch diedone-Eigenschaft desIteratorResult-Objekts.
Diese Funktion, zusammen mit dem StopIteration globalen Konstruktor, wurde in Firefox 58+ entfernt. Für zukunftsorientierte Verwendungen sollten Sie die for...of-Schleifen und das Iterator-Protokoll nutzen.
Sharp-Variablen
Sharp-Variablen sind obsolet. Verwenden Sie stattdessen temporäre Variablen, um zirkuläre Strukturen zu erstellen.