Veraltete und obsoleszente 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 nutzbar).
Veraltete Funktionen
Diese veralteten Funktionen können noch verwendet werden, sollten jedoch mit Vorsicht eingesetzt werden, da sie nicht von jeder JavaScript-Engine implementiert werden müssen. Sie sollten daran arbeiten, deren Verwendung aus Ihrem Code zu entfernen.
Einige dieser veralteten Funktionen sind im Anhang B der ECMAScript-Spezifikation aufgeführt. Dieser Abschnitt wird als normativ optional beschrieben - d.h. Webbrowser-Hosts müssen diese Funktionen implementieren, während Nicht-Web-Hosts dies möglicherweise nicht tun. Diese Funktionen sind wahrscheinlich stabil, da ihre Entfernung Rückwärtskompatibilitätsprobleme verursachen und alte Webseiten beeinträchtigen würde. (JavaScript hat das Designziel "bruch der Web-Kompatibilität vermeiden".) Dennoch sind sie nicht plattformübergreifend portabel und werden möglicherweise nicht von allen Analysetools unterstützt, daher wird Ihnen geraten, sie nicht zu verwenden, wie die Einführung von Anhang B besagt:
… Alle in diesem Anhang spezifizierten Sprachfunktionen und Verhaltensweisen haben ein oder mehrere unerwünschte Merkmale und würden in Abwesenheit von Legacy-Nutzung aus dieser Spezifikation entfernt werden. …
… Programmierer sollten diese Funktionen und Verhaltensweisen beim Schreiben neuer ECMAScript-Codes nicht verwenden oder deren Existenz annehmen. …
Einige andere, obwohl im Hauptkorpus der Spezifikation, sind ebenfalls als normativ optional markiert und sollten nicht verwendet 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 beginnen Zeilenkommentare. -->
ist nur am Anfang einer Zeile gültig (um Mehrdeutigkeiten mit einem Postfix-Decrement gefolgt von einem Größer-als-Operator zu vermeiden), während <!--
überall in der Zeile auftreten kann.
RegExp
Die folgenden Eigenschaften sind veraltet. Dies beeinflusst nicht ihre Verwendung in Ersetzungsstrings:
$1–$9
-
Klammerbegrenzte Teilzeichenfolgenübereinstimmungen, falls vorhanden.
input
,$_
-
Die Zeichenfolge, gegen die ein regulärer Ausdruck gematcht wird.
lastMatch
,$&
-
Die zuletzt gematchte Teilzeichenfolge.
lastParen
,$+
-
Die zuletzt geklammerte Teilzeichenfolge, falls vorhanden.
leftContext
,$`
-
Die Teilzeichenfolge vor dem neusten Match.
rightContext
,$'
-
Die Teilzeichenfolge nach dem neusten Match.
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 RegExp
-Instanz.
Die folgenden Regex-Syntaxen sind veraltet und nur im Unicode-unbewussten Modus verfügbar. Im Unicode-bewussten Modus sind sie alle Syntaxfehler:
- Lookahead-Ausdrücke können Quantifizierer haben.
- Rückverweise, die sich nicht auf eine bestehende fangende Gruppe beziehen, werden zu alten oktalen Escapes.
- In Zeichenklassen wird die Zeichenspanne, bei der eine Grenze eine Zeichenklasse ist, der
-
zu einem wörtlichen Zeichen. - Eine Escape-Sequenz, die nicht erkannt wird, wird zu einem "Identitäts-Escape".
- Escape-Sequenzen innerhalb von Zeichenklassen in der Form
\cX
, bei derX
eine Zahl oder_
ist, werden in der gleichen Weise dekodiert wie solche mit ASCII-Buchstaben:\c0
ist dasselbe wie\cP
, wenn man es modulo 32 nimmt. Zusätzlich, wenn die Form\cX
angetroffen wird, woX
nicht einer der anerkannten Zeichen ist, dann wird der Backslash als wörtliches Zeichen behandelt. - Die Sequenz
\k
innerhalb eines Regex, das keine benannten fangenden Gruppen hat, wird als Identitäts-Escape behandelt. - Die Syntaxzeichen
]
,{
, und}
können wörtlich ohne Escape erscheinen, wenn sie nicht als Ende einer Zeichenklasse oder Quantifizierergrenzen interpretiert werden können.
Funktion
- Die
caller
-Eigenschaft von Funktionen und diearguments.callee
-Eigenschaft sind veraltet und im Strict-Modus nicht verfügbar. - Anstatt auf
arguments
als Eigenschaft einer Funktion zuzugreifen, sollten Sie dasarguments
-Objekt innerhalb von Funktionsclosure verwenden.
Objekt
- Die
Object.prototype.__proto__
-Zugreifer sind veraltet. Verwenden SieObject.getPrototypeOf
undObject.setPrototypeOf
stattdessen. Dies gilt nicht für den__proto__
-Literal-Schlüssel 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 so bald entfernt, aber es ist in Anhang B definiert und somit 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 Zeichenketten- und regulären Ausdruck-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 Strict-Modus nicht verfügbar.
Initialisierer in var
-Deklarationen von for...in
-Schleifenheadern sind veraltet und produzieren Syntaxfehler im Strict-Modus. Der Initialisierungsausdruck wird ausgewertet und der Variablen zugewiesen, aber der Wert wird bei der ersten Iteration der Schleife sofort neu zugewiesen.
Normalerweise darf der catch
-Block einer try...catch
-Anweisung keine Variablenerklärung mit demselben Namen wie die im catch()
gebundenen Variablen enthalten. Eine Erweiterungsgrammatik erlaubt dem catch
-Block, eine var
-deklarierte Variable mit demselben Namen wie der im catch
gebundenen Identifikator zu enthalten, aber nur, wenn die catch
-Bindung ein einfacher Identifikator ist, kein Destrukturierungsmuster. Diese Variableinitialisierung und -zuweisung würde jedoch nur auf den im catch
gebundenen Identifikator wirken, anstatt auf die übergeordnete Scope-Variable, und das Verhalten könnte verwirrend sein.
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 im Anhang B der Spezifikation aufgeführt und daher möglicherweise nicht überall implementiert. Vermeiden Sie Namenskonflikte zwischen dem im catch
gebundenen Identifikator und Variablen, die im catch
-Block deklariert sind.
Obsolet gewordene Funktionen
Diese obsolet gewordenen Funktionen wurden vollständig aus JavaScript entfernt und können nicht mehr ab der angegebenen Version von JavaScript verwendet werden.
RegExp
Die folgenden Eigenschaften sind nun Eigenschaften von RegExp
-Instanzen, nicht länger 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 die Groß-/Kleinschreibung beim Versuch eines Matches in einem String ignoriert wird. |
lastIndex |
Der Index, an dem der nächste Match beginnt. |
multiline (auch über RegExp.$* ) |
Ob in Strings über mehrere Zeilen hinweg gesucht wird. |
source |
Der Text des Musters. |
Die valueOf()
-Methode ist nicht länger für RegExp
spezifiziert. Sie verwendet Object.prototype.valueOf()
, was sich selbst zurückgibt.
Funktion
- Funktionen
arity
-Eigenschaft 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__ |
Zeigt auf den Kontext eines Objekts. | Keine direkte Alternative |
__iterator__ |
Wird mit Legacy-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() |
Ausführt einen JavaScript-String im Kontext des angegebenen Objekts. | Keine direkte Alternative |
Object.observe() |
Asynchrones Beobachten der Änderungen an einem Objekt. | Proxy |
Object.unobserve() |
Entfernt Beobachter. | Proxy |
Object.getNotifier() |
Erstellt ein Benachrichtigungsobjekt, das es ermöglicht, eine synthetische Änderungsbeobachtung mit Object.observe() auszulösen. |
Keine direkte Alternative |
Object.prototype.watch() |
Hängt einen Handler-Callback an eine Eigenschaft an, der aufgerufen wird, wenn die Eigenschaft zugewiesen wird. | Proxy |
Object.prototype.unwatch() |
Entfernt Überwachungs-Handler für eine 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 veraltet und in Firefox 68 entfernt. Sie können Methoden aufString.prototype
zusammen mitFunction.call
verwenden. String.prototype.quote
wurde aus Firefox 37 entfernt.- Nicht standardisierte
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 einemWeakMap
zu durchlaufen.
Datum
Date.prototype.toLocaleFormat()
, das einen Formatstring im gleichen Format erwartete wie diestrftime()
-Funktion in C, ist obsolet. Verwenden SietoLocaleString()
oderIntl.DateTimeFormat
stattdessen.
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 veraltet und in Firefox 71 entfernt. Sie können Methoden aufArray.prototype
zusammen mitFunction.call
verwenden.
Number
Number.toInteger()
ist obsolet. Verwenden SieMath.floor
,Math.round
oder andere Methoden stattdessen.
Proxy
Proxy.create
undProxy.createFunction
sind obsolet. Verwenden Sie denProxy()
-Konstruktor stattdessen.- 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
stattdessen.- Let-Blöcke und Let-Ausdrücke sind obsolet.
- Ausdrucksschlüsse (
function () 1
als Kurzform vonfunction () { return 1; }
) sind obsolet. Verwenden Sie reguläreFunktionen
oder Pfeilfunktionen stattdessen.
Ermittlung von Quelltext
Die toSource()
-Methoden von Arrays, Zahlen, Strings usw. und die globale uneval()
-Funktion sind obsolet. Verwenden Sie toString()
, oder schreiben Sie Ihre eigene Serialisierungsmethode stattdessen.
Legacy-Generator und -Iterator
Alte Generatorfunktion-Anweisungen und alte Generatorfunktion-Ausdrücke wurden entfernt. Die alte Generatorfunktionssyntax wiederverwendet das Schlüsselwort function
, das automatisch zu einer Generatorfunktion wird, wenn sich im Körper eine oder mehrere yield
-Ausdrücke befinden – dies ist jetzt ein Syntaxfehler. Verwenden Sie stattdessen function*
-Anweisungen und function*
-Ausdrücke.
Array-Komprehensionen und Generator-Komprehensionen 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)
Firefox, vor Version 26, implementierte ein weiteres Iteratorprotokoll, das dem Standard-Iteratorprotokoll ähnlich ist. Ein Objekt ist ein alter Iterator, wenn es eine next()
-Methode implementiert, die bei jedem Aufruf einen Wert produziert und am Ende der Iteration ein StopIteration
-Objekt wirft. Dieses alte Iteratorprotokoll unterscheidet sich vom Standard-Iteratorprotokoll:
- Der Wert wurde direkt als Rückgabewert von Aufrufen an
next()
zurückgegeben, anstatt in dervalue
-Eigenschaft desIteratorResult
-Objekts. - Die Terminierung der Iteration wurde ausgedrückt, indem ein
StopIteration
-Objekt geworfen wurde, anstatt durch diedone
-Eigenschaft desIteratorResult
-Objekts.
Dieses Feature, zusammen mit dem globalen StopIteration
-Konstruktor, wurde in Firefox 58 + entfernt. Für zukunftsorientierte Anwendungen sollten Sie in Erwägung ziehen, for...of
-Schleifen und das Iteratorprotokoll zu verwenden.
Scharfe Variablen
Scharfe Variablen sind obsolet. Um kreisförmige Strukturen zu erstellen, verwenden Sie stattdessen temporäre Variablen.