已弃用和过时的功能
此页面列出了已弃用(即仍然可用但计划删除)和过时(即不再可用)的 JavaScript 功能。
¥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
这些已弃用的功能仍然可以使用,但应谨慎使用,因为并非每个 JavaScript 引擎都需要实现它们。你应该努力从代码中删除它们的使用。
¥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.
ECMAScript 规范的 附录 B 部分列出了其中一些已弃用的功能。本节被描述为规范性可选 — 即,Web 浏览器主机必须实现这些功能,而非 Web 主机则可能不会。这些功能可能是稳定的,因为删除它们会导致向后兼容性问题并破坏旧网站。(JavaScript 的设计目标是 "不要破坏网络"。)尽管如此,它们并不是跨平台可移植的,并且可能不是所有分析工具都支持,因此建议你不要使用它们,正如附录 B 的介绍所述:
¥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. …
…程序员在编写新的 ECMAScript 代码时不应使用或假设这些功能和行为的存在。…
¥… 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 注释
¥HTML comments
JavaScript 源如果解析为脚本,则允许类似 HTML 的注释,就好像脚本是 <script>
标记的一部分一样。
¥JavaScript source, if parsed as scripts, allows HTML-like comments, as if the script is part of a <script>
tag.
以下是在 Web 浏览器(或 Node.js,使用 Chrome 的 V8 引擎)中运行时有效的 JavaScript:
¥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
-
括号内的子字符串匹配(如果有)。
input, $_
-
与正则表达式匹配的字符串。
lastMatch, $&
-
最后匹配的子字符串。
lastParen, $+
-
最后一个带括号的子字符串匹配(如果有)。
leftContext, $`
-
最近匹配项之前的子字符串。
rightContext, $'
-
最近匹配项后面的子字符串。
警告:避免使用这些静态属性,因为它们可能会导致 与外部代码交互时出现问题!
¥Warning: Avoid using these static properties, as they can cause issues when interacting with external code!
compile()
方法已弃用。而是构造一个新的 RegExp
实例。
¥The compile()
method is deprecated. Construct a new RegExp
instance instead.
以下正则表达式语法已弃用,仅在 Unicode 不识别模式 中可用。在 Unicode 感知模式下,它们都是语法错误:
¥The following regex syntaxes are deprecated and only available in Unicode-unaware mode. In Unicode-aware mode, they are all syntax errors:
- 前瞻断言 可以有 quantifiers。
- 不引用现有捕获组的 反向引用 变为 遗留八进制转义。
- 在 字符类 中,一个边界是字符类的字符范围使
-
成为文字字符。 - 无法识别的转义序列将变为 "身份逃避"。
\cX
形式的 字符类 内的转义序列(其中X
是数字或_
)的解码方式与 ASCII 字母的解码方式相同:当对 32 取模时,\c0
与\cP
相同。此外,如果在X
不是可识别字符之一的任何地方遇到形式\cX
,则反斜杠将被视为文字字符。- 正则表达式中没有任何 命名捕获组 的序列
\k
被视为身份转义。 - 如果语法字符
]
、{
和}
不能被解释为字符类或量词定界符的结尾,则它们可能会出现 literally 而无需转义。
函数
¥Function
- 函数的
caller
属性和arguments.callee
属性已弃用并且在严格模式下不可用。 - 你应该在函数闭包内使用
arguments
对象,而不是将arguments
作为函数的属性进行访问。
对象
¥Object
Object.prototype.__proto__
访问器已弃用。请改用Object.getPrototypeOf
和Object.setPrototypeOf
。这不适用于对象文字中的__proto__
文字键。Object.prototype.__defineGetter__
、Object.prototype.__defineSetter__
、Object.prototype.__lookupGetter__
和Object.prototype.__lookupSetter__
方法已弃用。请改用Object.getOwnPropertyDescriptor
和Object.defineProperty
。
字符串
¥String
- HTML 封装器方法,如
String.prototype.fontsize
和String.prototype.big
。 String.prototype.substr
可能不会很快被删除,但它在附件 B 中定义,因此是规范性可选的。String.prototype.trimLeft
和String.prototype.trimRight
应替换为String.prototype.trimStart
和String.prototype.trimEnd
。
日期
¥Date
getYear()
和setYear()
方法受到 2000 年问题的影响,并已包含在getFullYear
和setFullYear
中。toGMTString()
方法已弃用。请改用toUTCString()
。
转义序列
¥Escape sequences
- 八进制转义序列(\ 后跟一位、两位或三位八进制数字)在字符串和正则表达式文字中已被弃用。
escape()
和unescape()
函数已弃用。使用encodeURI()
、encodeURIComponent()
、decodeURI()
或decodeURIComponent()
对特殊字符的转义序列进行编码和解码。
语句
¥Statements
with
语句已弃用并且在严格模式下不可用。
¥The with
statement is deprecated and unavailable in strict mode.
for...in
循环头的 var
声明中的初始化程序已弃用,并在严格模式下生成 语法错误。在非严格模式下它们会被默默地忽略。
¥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.
通常,try...catch
语句的 catch
块不能包含任何与 catch()
中绑定的变量同名的变量声明。扩展语法允许 catch
块包含与 catch
绑定标识符同名的 var
声明变量,但前提是 catch
绑定是简单标识符,而不是 解构模式。然而,该变量的初始化和赋值仅作用于 catch
绑定标识符,而不是上层作用域变量,并且行为可能会令人困惑。
¥Normally, the catch
block of a try...catch
statement cannot contain any variable declaration with the same name as the variables bound in the catch()
. An extension grammar allows the catch
block to contain a var
declared variable with the same name as the catch
-bound identifier, but only if the catch
binding is a simple identifier, not a destructuring pattern. However, this variable's initialization and assignment would only act on the catch
-bound identifier, instead of the upper scope variable, and the behavior could be confusing.
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
这列在规范的附录 B 中,因此可能无法在所有地方实现。避免 catch
绑定标识符和 catch
块中声明的变量之间发生任何名称冲突。
¥This is listed in Annex B of the spec and hence may not be implemented everywhere. Avoid any name conflicts between the catch
-bound identifier and variables declared in the catch
block.
过时的功能
RegExp
以下现在是 RegExp
实例的属性,不再是 RegExp
构造函数的属性:
¥The following are now properties of RegExp
instances, no longer of the RegExp
constructor:
属性 | 描述 |
---|---|
global |
是否针对字符串中所有可能的匹配项测试正则表达式,或者仅针对第一个匹配项。 |
ignoreCase |
尝试在字符串中进行匹配时是否忽略大小写。 |
lastIndex |
下一场比赛开始的索引。 |
multiline (也通过 RegExp.$* ) |
是否跨多行搜索字符串。 |
source |
图案的文本。 |
valueOf()
方法不再专门用于 RegExp
。它使用 Object.prototype.valueOf()
,它返回自身。
¥The valueOf()
method is no longer specialized for RegExp
. It uses Object.prototype.valueOf()
, which returns itself.
函数
对象
¥Object
属性 | 描述 | 选择 |
---|---|---|
__count__ |
直接返回用户定义对象上的可枚举属性的数量。 | Object.keys() |
__parent__ |
指向对象的上下文。 | 没有直接替换 |
__iterator__ |
与 遗留迭代器 一起使用。 | Symbol.iterator 和新 迭代协议 |
__noSuchMethod__ |
当不存在的属性被作为方法调用时调用的方法。 | Proxy |
Object.prototype.eval() |
在指定对象的上下文中计算 JavaScript 代码字符串。 | 没有直接替换 |
Object.observe() |
异步观察对象的变化。 | Proxy |
Object.unobserve() |
移除观察者。 | Proxy |
Object.getNotifier() |
创建一个通知程序对象,允许使用 Object.observe() 综合触发可观察的更改。 |
没有直接替换 |
Object.prototype.watch() |
将处理程序回调附加到分配属性时调用的属性。 | Proxy |
Object.prototype.unwatch() |
删除属性上的监视处理程序。 | Proxy |
字符串
¥String
- 像
String.slice(myStr, 0, 12)
、String.replace(myStr, /\./g, "!")
等非标准字符串泛型方法已在 Firefox 1.5 (JavaScript 1.6) 中引入,在 Firefox 53 中弃用,并在 Firefox 68 中删除。你可以将String.prototype
上的方法与Function.call
一起使用。 String.prototype.quote
已从 Firefox 37 中删除。String.prototype.search
、String.prototype.match
和String.prototype.replace
中的非标准flags
参数已过时。
WeakMap
WeakMap.prototype.clear()
在 Firefox 20 中添加,在 Firefox 46 中删除。不可能遍历WeakMap
中的所有键。
日期
¥Date
Date.prototype.toLocaleFormat()
使用的格式字符串与 C 中strftime()
函数所期望的格式相同,已过时。请改用toLocaleString()
或Intl.DateTimeFormat
。
数组
¥Array
- 像
Array.slice(myArr, 0, 12)
、Array.forEach(myArr, myFn)
等非标准数组泛型方法已在 Firefox 1.5 (JavaScript 1.6) 中引入,在 Firefox 68 中弃用,并在 Firefox 71 中删除。你可以将Array.prototype
上的方法与Function.call
一起使用。
数字
代理
¥Proxy
Proxy.create
和Proxy.createFunction
已过时。请改用Proxy()
构造函数。- 以下陷阱已过时:
hasOwn
(错误 980565,火狐 33)。getEnumerablePropertyKeys
(错误 783829、火狐 37)getOwnPropertyNames
(错误 1007334、火狐 33)keys
(错误 1007334、火狐 33)
ParallelArray
语句
¥Statements
for each...in
已过时。请改用for...of
。- let 块和 let 表达式已过时。
- 表达式闭包(
function () 1
作为function () { return 1; }
的简写)已过时。请使用常规functions
或 arrow functions 代替。
获取源文本
¥Acquiring source text
数组、数字、字符串等的 toSource()
方法和 uneval()
全局函数已过时。使用 toString()
,或者编写你自己的序列化方法。
¥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
旧版生成器函数语句和旧版生成器函数表达式已被删除。旧版生成器函数语法重用了 function
关键字,当主体中有一个或多个 yield
表达式时,该关键字会自动成为生成器函数 - 现在这是一个语法错误。请改用 function*
声明 和 function*
表达式。
¥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 在版本 26 之前实现了另一个类似于标准 迭代器协议 的迭代器协议。当一个对象实现 next()
方法时,它就是一个遗留迭代器,该方法在每次调用时生成一个值,并在迭代结束时抛出一个 StopIteration
对象。此遗留迭代器协议与标准迭代器协议不同:
¥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:
- 该值直接作为调用
next()
的返回值返回,而不是IteratorResult
对象的value
属性。 - 迭代终止是通过抛出
StopIteration
对象来表示的,而不是通过IteratorResult
对象的done
属性来表示。
此功能与 StopIteration
全局构造函数一起在 Firefox 58+ 中被删除。对于面向未来的用途,请考虑使用 for...of
循环和 迭代器协议。
¥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 变量已经过时了。要创建循环结构,请改用临时变量。
¥Sharp variables are obsolete. To create circular structures, use temporary variables instead.