已弃用和过时的功能

此页面列出了已弃用(即仍然可用但计划删除)和过时(即不再可用)的 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):

js
<!-- 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 作为函数的属性进行访问。

对象

字符串

¥String

日期

¥Date

转义序列

¥Escape sequences

语句

¥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.

js
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.

过时的功能

¥Obsolete features

这些过时的功能已从 JavaScript 中完全删除,并且从指定的 JavaScript 版本开始不能再使用。

¥These obsolete features have been entirely removed from JavaScript and can no longer be used as of the indicated version of JavaScript.

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.

函数

¥Function

  • 函数的 arity 属性已过时。请改用 length

对象

¥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

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 一起使用。
属性 描述 选择
Array.observe() 异步观察数组的更改。 Proxy
Array.unobserve() 移除观察者。 Proxy

数字

¥Number

代理

¥Proxy

ParallelArray

  • ParallelArray 已过时。

语句

¥Statements

  • for each...in 已过时。请改用 for...of
  • let 块和 let 表达式已过时。
  • 表达式闭包(function () 1 作为 function () { return 1; } 的简写)已过时。请使用常规 functionsarrow 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.

js
// 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.