Deprecated and obsolete features
This page lists features of JavaScript that are deprecated (that is, still available but planned for removal) and obsolete (that is, no longer usable).
Deprecated features
These deprecated features can still be used, but should be used with caution because they are not required to be implemented by every JavaScript engine. You should work to remove their use from your code.
Some of these deprecated features are listed in the Annex B section of the ECMAScript specification. This section is described as normative optional — that is, web browser hosts must implement these features, while non-web hosts may not. These features are likely stable because removing them will cause backward compatibility issues and break legacy websites. (JavaScript has the design goal of "don't break the web".) Still, they are not cross-platform portable and may not be supported by all analysis tools, so you are advised to not use them, as the introduction of Annex B states:
… All of the language features and behaviors specified in this annex have one or more undesirable characteristics and in the absence of legacy usage would be removed from this specification. …
… Programmers should not use or assume the existence of these features and behaviors when writing new ECMAScript code. …
Some others, albeit in the main spec body, are also marked as normative optional and should not be depended on.
HTML comments
JavaScript source, if parsed as scripts, allows HTML-like comments, as if the script is part of a <script>
tag.
The following is valid JavaScript when running in a web browser (or Node.js, which uses the V8 engine powering Chrome):
<!-- comment
console.log("a"); <!-- another comment
console.log("b");
--> More comment
// Logs "a" and "b"
<!--
and -->
both act like //
, i.e. starting line comments. -->
is only valid at the start of a line (to avoid ambiguity with a postfix decrement followed by a greater than operator), while <!--
can occur anywhere in the line.
RegExp
The following properties are deprecated. This does not affect their use in replacement strings:
$1–$9
-
Parenthesized substring matches, if any.
input, $_
-
The string against which a regular expression is matched.
lastMatch, $&
-
The last matched substring.
lastParen, $+
-
The last parenthesized substring match, if any.
leftContext, $`
-
The substring preceding the most recent match.
rightContext, $'
-
The substring following the most recent match.
Warning: Avoid using these static properties, as they can cause issues when interacting with external code!
The compile()
method is deprecated. Construct a new RegExp
instance instead.
Function
- The
caller
property of functions and thearguments.callee
property are deprecated and unavailable in strict mode. - Instead of accessing
arguments
as a property of a function, you should use thearguments
object inside function closures.
Object
- The
Object.prototype.__proto__
accessors are deprecated. UseObject.getPrototypeOf
andObject.setPrototypeOf
instead. This does not apply to the__proto__
literal key in object literals. - The
Object.prototype.__defineGetter__
,Object.prototype.__defineSetter__
,Object.prototype.__lookupGetter__
, andObject.prototype.__lookupSetter__
methods are deprecated. UseObject.getOwnPropertyDescriptor
andObject.defineProperty
instead.
String
- HTML wrapper methods like
String.prototype.fontsize
andString.prototype.big
. String.prototype.substr
probably won't be removed anytime soon, but it's defined in Annex B and hence normative optional.String.prototype.trimLeft
andString.prototype.trimRight
should be replaced withString.prototype.trimStart
andString.prototype.trimEnd
.
Date
- The
getYear()
andsetYear()
methods are affected by the Year-2000-Problem and have been subsumed bygetFullYear
andsetFullYear
. - The
toGMTString()
method is deprecated. UsetoUTCString()
instead.
Escape sequences
- Octal escape sequences (\ followed by one, two, or three octal digits) are deprecated in string and regular expression literals.
- The
escape
andunescape
functions are deprecated. UseencodeURI
,encodeURIComponent
,decodeURI
ordecodeURIComponent
to encode and decode escape sequences for special characters.
Statements
The with
statement is deprecated and unavailable in strict mode.
Initializers in var
declarations of for...in
loops headers are deprecated and produce syntax errors in strict mode. They are silently ignored in non-strict mode.
Obsolete features
These obsolete features have been entirely removed from JavaScript and can no longer be used as of the indicated version of JavaScript.
RegExp
The following are now properties of RegExp
instances, no longer of the RegExp
constructor:
Property | Description |
---|---|
global |
Whether or not to test the regular expression against all possible matches in a string, or only against the first. |
ignoreCase |
Whether or not to ignore case while attempting a match in a string. |
lastIndex |
The index at which to start the next match. |
multiline (also via RegExp.$* ) |
Whether or not to search in strings across multiple lines. |
source |
The text of the pattern. |
The valueOf()
method is no longer specialized for RegExp
. It uses Object.prototype.valueOf()
, which returns itself.
Function
- Functions'
arity
property is obsolete. Uselength
instead.
Object
Property | Description | Alternative |
---|---|---|
__count__ |
Returns the number of enumerable properties directly on a user-defined object. | Object.keys() |
__parent__ |
Points to an object's context. | No direct replacement |
__iterator__ |
Used with legacy iterators. | Symbol.iterator and the new iteration protocols |
__noSuchMethod__ |
A method called when a non-existent property is called as method. | Proxy |
Object.prototype.eval() |
Evaluates a string of JavaScript code in the context of the specified object. | No direct replacement |
Object.observe() |
Asynchronously observing the changes to an object. | Proxy |
Object.unobserve() |
Remove observers. | Proxy |
Object.getNotifier() |
Create a notifier object that allows to synthetically trigger a change observable with Object.observe() . |
No direct replacement |
Object.prototype.watch() |
Attach a handler callback to a property that gets called when the property is assigned. | Proxy |
Object.prototype.unwatch() |
Remove watch handlers on a property. | Proxy |
String
- Non-standard String generic methods like
String.slice(myStr, 0, 12)
,String.replace(myStr, /\./g, "!")
, etc. have been introduced in Firefox 1.5 (JavaScript 1.6), deprecated in Firefox 53, and removed in Firefox 68. You can use methods onString.prototype
together withFunction.call
instead. String.prototype.quote
is removed from Firefox 37.- Non-standard
flags
parameter inString.prototype.search
,String.prototype.match
, andString.prototype.replace
are obsolete.
WeakMap
WeakMap.prototype.clear()
was added in Firefox 20 and removed in Firefox 46. It is not possible to traverse all keys in aWeakMap
.
Date
Date.prototype.toLocaleFormat()
is obsolete. UsetoLocaleString
orIntl.DateTimeFormat
instead.
Array
- Non-standard Array generic methods like
Array.slice(myArr, 0, 12)
,Array.forEach(myArr, myFn)
, etc. have been introduced in Firefox 1.5 (JavaScript 1.6), deprecated in Firefox 68, and removed in Firefox 71. You can use methods onArray.prototype
together withFunction.call
instead.
Number
Number.toInteger()
is obsolete. UseMath.floor
,Math.round
, or other methods instead.
Proxy
Proxy.create
andProxy.createFunction
are obsolete. Use theProxy()
constructor instead.- The following traps are obsolete:
hasOwn
(bug 980565, Firefox 33).getEnumerablePropertyKeys
(bug 783829, Firefox 37)getOwnPropertyNames
(bug 1007334, Firefox 33)keys
(bug 1007334, Firefox 33)
ParallelArray
ParallelArray
is obsolete.
Statements
for each...in
is obsolete. Usefor...of
instead.- let blocks and let expressions are obsolete.
- Expression closures are obsolete. Use regular
functions
or arrow functions instead.
Acquiring source text
The toSource()
methods of arrays, numbers, strings, etc. and the uneval()
global function are obsolete. Use toString()
, or write your own serialization method instead.
Legacy generator and iterator
Legacy generator function statements and legacy generator function expressions are removed. The legacy generator function syntax reuses the function
keyword, which automatically becomes a generator function when there are one or more yield
expressions in the body — this is now a syntax error. Use function*
statements and function*
expressions instead.
Array comprehensions and generator comprehensions are removed.
// 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, prior to version 26, implemented another iterator protocol that is similar to the standard Iterator protocol. An object is an legacy iterator when it implements a next()
method, which produces a value on each call and throws a StopIteration
object at the end of iteration. This legacy iterator protocol differs from the standard iterator protocol:
- The value was returned directly as the return value of calls to
next()
, instead of thevalue
property of theIteratorResult
object. - Iteration termination was expressed by throwing a
StopIteration
object, instead of through thedone
property of theIteratorResult
object.
This feature, along with the StopIteration
global constructor, was removed in Firefox 58+. For future-facing usages, consider using for...of
loops and the iterator protocol.
Sharp variables
Sharp variables are obsolete. To create circular structures, use temporary variables instead.