Veraltete und nicht mehr verfügbare Funktionen
Diese Seite listet JavaScript-Funktionen auf, die veraltet sind (also noch verfügbar sind, aber nicht mehr verwendet werden sollten) oder nicht mehr verfügbar sind (also nicht mehr verwendet werden können).
Veraltete Funktionen
Diese veralteten Funktionen können weiterhin verwendet werden. Dabei ist jedoch Vorsicht geboten, da nicht jede JavaScript-Engine sie implementieren muss. Sie sollten daran arbeiten, ihre Verwendung aus Ihrem Code zu entfernen.
Einige dieser veralteten Funktionen sind in Anhang B der ECMAScript-Spezifikation aufgeführt. Dieser Abschnitt wird als normativ optional bezeichnet: Browser-Hosts müssen diese Funktionen implementieren, andere Hosts dagegen nicht. Die Funktionen bleiben wahrscheinlich erhalten, da ihre Entfernung Probleme mit der Abwärtskompatibilität verursachen und ältere Websites beeinträchtigen würde. (Ein Entwurfsziel von JavaScript lautet „das Web nicht kaputtmachen“.) Dennoch sind sie nicht plattformübergreifend portabel und werden möglicherweise nicht von allen Analysewerkzeugen unterstützt. Daher sollten Sie sie nicht verwenden, wie bereits die Einleitung zu Anhang B festhält:
… Alle in diesem Anhang spezifizierten Sprachfunktionen und Verhaltensweisen weisen eine oder mehrere unerwünschte Eigenschaften auf und würden ohne ihre Verwendung in älterem Code aus dieser Spezifikation entfernt. …
… Programmierer sollten beim Schreiben neuen ECMAScript-Codes diese Funktionen und Verhaltensweisen weder verwenden noch deren Vorhandensein voraussetzen. …
Einige andere Funktionen stehen zwar im Hauptteil der Spezifikation, sind aber ebenfalls als normativ optional gekennzeichnet. Auch auf sie sollten Sie sich nicht verlassen.
HTML-Kommentare
Wenn JavaScript-Quelltext als Skript geparst wird, sind HTML-ähnliche Kommentare zulässig – als wäre das Skript Teil eines <script>-Tags.
Das Folgende ist gültiges JavaScript, wenn es in einem Webbrowser ausgeführt wird (oder in Node.js, das die auch in Chrome verwendete V8-Engine nutzt):
<!-- comment
console.log("a"); <!-- another comment
console.log("b");
--> More comment
// Logs "a" and "b"
<!-- und --> verhalten sich beide wie //, leiten also Zeilenkommentare ein. --> ist nur am Anfang einer Zeile gültig (um eine Mehrdeutigkeit mit einer Postfix-Dekrementierung gefolgt von einem Größer-als-Operator zu vermeiden). <!-- kann dagegen an beliebiger Stelle in der Zeile stehen.
RegExp
Die folgenden Eigenschaften sind veraltet. Ihre Verwendung in Ersetzungszeichenfolgen ist davon nicht betroffen:
$1–$9-
Übereinstimmungen mit Teilzeichenfolgen in Klammern, sofern vorhanden.
input,$_-
Die Zeichenfolge, mit der ein regulärer Ausdruck abgeglichen wird.
lastMatch,$&-
Die zuletzt gefundene übereinstimmende Teilzeichenfolge.
lastParen,$+-
Die zuletzt gefundene Übereinstimmung mit einer Teilzeichenfolge in Klammern, sofern vorhanden.
leftContext,$`-
Die Teilzeichenfolge vor der jüngsten Übereinstimmung.
rightContext,$'-
Die Teilzeichenfolge nach der jüngsten Übereinstimmung.
Warnung: Vermeiden Sie die Verwendung dieser statischen Eigenschaften, da sie bei der Interaktion mit externem Code Probleme verursachen können!
Die Methode compile() ist veraltet. Erstellen Sie stattdessen eine neue RegExp-Instanz.
Die folgenden Syntaxformen für reguläre Ausdrücke sind veraltet und nur im Modus ohne Unicode-Unterstützung verfügbar. Im Unicode-bewussten Modus führen sie alle zu Syntaxfehlern:
- Lookahead-Assertions können Quantifizierer haben.
- Rückverweise, die sich nicht auf eine vorhandene Capturing Group beziehen, werden zu herkömmlichen oktalen Escape-Sequenzen.
- In Zeichenklassen wird
-als wörtliches Zeichen behandelt, wenn eine Grenze eines Zeichenbereichs eine Zeichenklasse ist. - Eine nicht erkannte Escape-Sequenz wird zu einem „Identity Escape“.
- Escape-Sequenzen innerhalb von Zeichenklassen der Form
\cX, bei denenXeine Zahl oder_ist, werden genauso dekodiert wie solche mit ASCII-Buchstaben:\c0entspricht\cP, wenn der Wert modulo 32 genommen wird. Tritt die Form\cXan einer beliebigen Stelle auf und istXkeines der erkannten Zeichen, wird der Backslash als wörtliches Zeichen behandelt. - Die Sequenz
\kwird in einem regulären Ausdruck ohne benannte Capturing Groups als Identity Escape behandelt. - Die Syntaxzeichen
],{und}dürfen ohne Escape-Zeichen wörtlich auftreten, wenn sie nicht als Ende einer Zeichenklasse oder als Begrenzungszeichen eines Quantifizierers interpretiert werden können.
Function
- Die Eigenschaft
callervon Funktionen und die Eigenschaftarguments.calleesind veraltet und im Strict Mode nicht verfügbar. - Statt auf
argumentsals Eigenschaft einer Funktion zuzugreifen, sollten Sie das Objektargumentsinnerhalb von Funktions-Closures verwenden.
Object
- Die Accessors
Object.prototype.__proto__sind veraltet. Verwenden Sie stattdessenObject.getPrototypeOfundObject.setPrototypeOf. Dies gilt nicht für den wörtlichen Schlüssel__proto__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-Wrapper-Methoden wie
String.prototype.fontsizeundString.prototype.big. String.prototype.substrwird wahrscheinlich nicht so bald entfernt, ist aber 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 durchgetFullYearundsetFullYearabgelöst. - Die Methode
toGMTString()ist veraltet. Verwenden Sie stattdessentoUTCString().
Escape-Sequenzen
- Oktale Escape-Sequenzen (\ gefolgt von einer, zwei oder drei oktalen Ziffern) sind in Zeichenfolgenliteralen und Literalen für reguläre Ausdrücke 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 Anweisung with ist veraltet und im Strict Mode nicht verfügbar.
Initialisierungen in var-Deklarationen im Kopf von for...in-Schleifen sind veraltet und verursachen im Strict Mode Syntaxfehler. Der Initialisierungsausdruck wird ausgewertet und der Variablen zugewiesen, aber der Wert würde beim ersten Schleifendurchlauf sofort neu zugewiesen.
Normalerweise darf der catch-Block einer try...catch-Anweisung keine Variablendeklaration enthalten, deren Name mit dem einer in catch() gebundenen Variablen übereinstimmt. Eine Erweiterung der Grammatik erlaubt im catch-Block jedoch eine mit var deklarierte Variable mit demselben Namen wie der in catch gebundene Bezeichner – allerdings nur, wenn die catch-Bindung ein einfacher Bezeichner und kein Destrukturierungsmuster ist. Die Initialisierung und Zuweisung dieser Variablen wirken sich jedoch nur auf den in catch gebundenen Bezeichner aus, nicht auf die Variable im äußeren Gültigkeitsbereich. Dieses Verhalten kann 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 in Anhang B der Spezifikation aufgeführt und wird daher möglicherweise nicht überall implementiert. Vermeiden Sie Namenskonflikte zwischen dem in catch gebundenen Bezeichner und Variablen, die im catch-Block deklariert werden.
Nicht mehr verfügbare Funktionen
Diese Funktionen wurden vollständig aus JavaScript entfernt und können ab der jeweils angegebenen JavaScript-Version nicht mehr verwendet werden.
RegExp
Die folgenden Eigenschaften gehören jetzt zu RegExp-Instanzen und nicht mehr zum RegExp-Konstruktor:
| Eigenschaft | Beschreibung |
|---|---|
global |
Ob der reguläre Ausdruck auf alle möglichen Übereinstimmungen in einer Zeichenfolge oder nur auf die erste geprüft wird. |
ignoreCase |
Ob beim Suchen nach einer Übereinstimmung in einer Zeichenfolge die Groß- und Kleinschreibung ignoriert wird. |
lastIndex |
Der Index, an dem die Suche nach der nächsten Übereinstimmung beginnt. |
multiline (auch über RegExp.$*) |
Ob in Zeichenfolgen über mehrere Zeilen hinweg gesucht wird. |
source |
Der Text des Musters. |
Die Methode valueOf() ist nicht mehr für RegExp spezialisiert. Sie verwendet Object.prototype.valueOf(), das das Objekt selbst zurückgibt.
Function
- Die Eigenschaft
arityvon Funktionen ist nicht mehr verfügbar. Verwenden Sie stattdessenlength.
Object
| Eigenschaft | Beschreibung | Alternative |
|---|---|---|
__count__ |
Gibt die Anzahl der aufzählbaren Eigenschaften zurück, die direkt auf einem benutzerdefinierten Objekt verfügbar sind. | Object.keys() |
__parent__ |
Verweist auf den Kontext eines Objekts. | Kein direkter Ersatz |
__iterator__ |
Wurde mit herkömmlichen Iteratoren verwendet. | Symbol.iterator und die neuen Iterationsprotokolle |
__noSuchMethod__ |
Eine Methode, die aufgerufen wird, wenn eine nicht vorhandene Eigenschaft als Methode aufgerufen wird. | Proxy |
Object.prototype.eval() |
Wertet eine Zeichenfolge mit JavaScript-Code im Kontext des angegebenen Objekts aus. | Kein direkter Ersatz |
Object.observe() |
Beobachtet Änderungen an einem Objekt asynchron. | Proxy |
Object.unobserve() |
Entfernt Beobachter. | Proxy |
Object.getNotifier() |
Erstellt ein Notifier-Objekt, mit dem sich eine durch Object.observe() beobachtbare Änderung künstlich auslösen lässt. |
Kein direkter Ersatz |
Object.prototype.watch() |
Fügt einer Eigenschaft eine Handler-Callback-Funktion hinzu, die bei einer Zuweisung an die Eigenschaft aufgerufen wird. | Proxy |
Object.prototype.unwatch() |
Entfernt Watch-Handler von 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 als veraltet eingestuft und in Firefox 68 entfernt. Stattdessen können Sie Methoden vonString.prototypezusammen mitFunction.callverwenden. String.prototype.quotewurde in Firefox 37 entfernt.- Der nicht standardisierte Parameter
flagsinString.prototype.search,String.prototype.matchundString.prototype.replaceist nicht mehr verfügbar.
WeakMap
WeakMap.prototype.clear()wurde in Firefox 20 hinzugefügt und in Firefox 46 entfernt. Es ist nicht möglich, alle Schlüssel einerWeakMapzu durchlaufen.
Date
Date.prototype.toLocaleFormat(), das eine Formatzeichenfolge im Format der C-Funktionstrftime()verwendete, ist nicht mehr verfügbar. Verwenden Sie stattdessentoLocaleString()oderIntl.DateTimeFormat.
Array
- Nicht standardisierte 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 als veraltet eingestuft und in Firefox 71 entfernt. Stattdessen können Sie Methoden vonArray.prototypezusammen mitFunction.callverwenden.
Number
Number.toInteger()ist nicht mehr verfügbar. Verwenden Sie stattdessenMath.floor,Math.roundoder andere Methoden.
Proxy
Proxy.createundProxy.createFunctionsind nicht mehr verfügbar. Verwenden Sie stattdessen den KonstruktorProxy().- Die folgenden Traps sind nicht mehr verfügbar:
hasOwn(Bug 980565, Firefox 33).getEnumerablePropertyKeys(Bug 783829, Firefox 37)getOwnPropertyNames(Bug 1007334, Firefox 33)keys(Bug 1007334, Firefox 33)
ParallelArray
ParallelArrayist nicht mehr verfügbar.
Anweisungen
for each...inist nicht mehr verfügbar. Verwenden Sie stattdessenfor...of.- let-Blöcke und let-Ausdrücke sind nicht mehr verfügbar.
- Expression Closures (
function () 1als Kurzform vonfunction () { return 1; }) sind nicht mehr verfügbar. Verwenden Sie stattdessen reguläreFunktionenoder Arrow-Funktionen.
Quelltext abrufen
Die toSource()-Methoden von Arrays, Zahlen, Zeichenfolgen usw. sowie die globale Funktion uneval() sind nicht mehr verfügbar. Verwenden Sie stattdessen toString() oder schreiben Sie eine eigene Serialisierungsmethode.
Herkömmliche Generatoren und Iteratoren
Herkömmliche Anweisungen und Ausdrücke für Generatorfunktionen wurden entfernt. Die herkömmliche Syntax für Generatorfunktionen verwendet das Schlüsselwort function. Die Funktion wird dabei automatisch zu einer Generatorfunktion, wenn ihr Funktionskörper einen oder mehrere yield-Ausdrücke enthält – dies ist jetzt ein Syntaxfehler. Verwenden Sie stattdessen function*-Anweisungen und function*-Ausdrücke.
Array Comprehensions und Generator Comprehensions wurden 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)
Vor Version 26 implementierte Firefox ein anderes Iteratorprotokoll, das dem standardisierten Iteratorprotokoll ähnelt. Ein Objekt ist ein herkömmlicher Iterator, wenn es eine next()-Methode implementiert, die bei jedem Aufruf einen Wert liefert und am Ende der Iteration ein StopIteration-Objekt auslöst. Dieses herkömmliche Iteratorprotokoll unterscheidet sich vom standardisierten Iteratorprotokoll:
- Der Wert wurde direkt als Rückgabewert von
next()-Aufrufen zurückgegeben statt über die EigenschaftvaluedesIteratorResult-Objekts. - Das Ende der Iteration wurde durch Auslösen eines
StopIteration-Objekts signalisiert statt über die EigenschaftdonedesIteratorResult-Objekts.
Diese Funktion wurde zusammen mit dem globalen Konstruktor StopIteration ab Firefox 58 entfernt. Für neuen Code sollten Sie for...of-Schleifen und das Iteratorprotokoll verwenden.
Sharp-Variablen
Sharp-Variablen sind nicht mehr verfügbar. Verwenden Sie stattdessen temporäre Variablen, um zyklische Strukturen zu erstellen.