废弃和过时的特性

本附录列出了那些已经废弃(仍然可用,但是已计划删除)或者过时(已被删除,无法使用)的 JavaScript 特性。

废弃的特性

这些废弃的特性仍然可以使用,但是使用时一定要保持谨慎,因为它们很可能会在未来的某个时间点被移除。应当将其从需要使用的代码中移除。

ECMAScript 规范的 Annex B 部分列出了其中的一些废弃功能。这一部分被描述为规范性的可选功能,也就是说,web 浏览器主机必须实现这些功能,而非 web 主机可以不实现。这些功能很可能是稳定的,因为删除它们会导致向下兼容的问题,并破坏传统的网站(JavaScript 的设计目标是“不要破坏 web”)。尽管如此,它们还是不能跨平台移植,而且可能不被所有的分析工具所支持,所以建议你不要使用它们,正如 Annex B 的介绍所说:

… 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.(程序员在编写新的 ECMAScript 代码时,不应该使用或假设这些特性和行为的存在。) …

其他一些,尽管在规范主体中,也被标记为规范性可选,不应该依赖它们。

HTML 注释

如果 JavaScript 源码被作为脚本代码解析,它允许 HTML 注释,就像这些脚本是 <script> 的标签一部分那样。

以下是在 web 浏览器(或使用支持 Chrome 的 V8 引擎的 Node.js)中运行的有效 JavaScript 代码:

js

<!-- 注释
console.log("a"); <!-- 另外一段注释
console.log("b");
--> 更多注释
// 输出 "a" 和 "b"

<!----> 的作用都与 // 类似,即起始行注释。--> 只在行首有效(以避免与紧跟大于运算符的后缀式自减相混淆),而 <!-- 可以出现在行的任何地方。

RegExp

下面的这些属性已经被废弃。这并不影响它们在 替换字符串 中的使用。

$1–$9

括号内的子串匹配结果。

input, $_

用于匹配正则表达式的字符串。

lastMatch, $&

最后匹配的子串。

lastParen, $+

最后一个括号内的子串匹配。

leftContext, $`

最近一次匹配前的子串。

rightContext, $'

最近一次匹配后的子串。

警告: 避免使用这些静态属性,因为它们可能导致 与外部代码交互时的问题

compile() 方法已被废弃,请构造一个新的 RegExp 实例。

Function

  • 函数的 caller arguments.callee 属性在严格模式中废弃且不可用。
  • 应该在函数闭包中使用 arguments 对象,而不是将 arguments 作为函数的一个属性来访问。
  • caller arguments 属性已经废弃,因为它们会泄漏调用函数的对象。应当在函数内部使用 arguments 对象来代替函数的 arguments 属性。

Object

String

语句

with 语句在严格模式中已被弃用且不可用。

在严格模式下, for...in 循环头的 var 声明中的初始化器被弃用并产生 语法错误 。在非严格模式下,它们会被静默地忽略。

过时的特性

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

RegExp

以下是 RegExp 实例的属性,不再是 RegExp 构造函数的属性:

valueOf() 方法不再专门用于 RegExp 。它使用 Object.prototype.valueOf() ,并返回它本身。

Function

  • Function 的 arity 属性已经过时,请使用 length 代替。

Object

String

WeakMap

  • WeakMap.prototype.clear() 在 Firefox 20 中添加,在 Firefox 46 中移除。不可能遍历一个 WeakMap 中的所有键。
  • Date.prototype.toLocaleFormat() 使用与 C 语言中 strftime() 函数所期望的格式相同的格式字符串,已经过时了。使用 toLocaleString() Intl.DateTimeFormat 代替。

Array

非标准的 Array 通用方法,如 Array.slice(myArr, 0, 12) Array.forEach(myArr, myFn) 等,在 Firefox 1.5(JavaScript 1.6)中引入,在 Firefox 68 中被废弃,并在 Firefox 71 中删除。你可以使用 Array.prototype Function.call 来代替。

  • Number.toInteger() 已经过时了。使用 Math.floor Math.round 或其他方法代替。
  • Proxy

    • Proxy.create Proxy.createFunction 已经过时了,请使用 Proxy() 构造函数。
    • 下列陷入已经过时:
    • hasOwn bug 980565 ,Firefox 33)
    • getEnumerablePropertyKeys bug 783829 ,Firefox 37)
    • getOwnPropertyNames bug 1007334 ,Firefox 33)
    • keys bug 1007334 ,Firefox 33)

    ParallelArray

    • ParallelArray 已过时。
    • for each...in 已经过时了,使用 for...of 代替。
    • let 块和 let 表达式已经过时了。
    • 表达式闭包( function () 1 作为 function () { return 1; } 的缩写)已经过时。使用常规的 function 箭头函数 代替。

    获取源文本

    数组、数字、字符串等的 toSource() 方法和 uneval() 全局函数已经过时。使用 toString() ,或者编写你自己的序列化方法来代替。

    遗留的生成器和迭代器

    遗留的生成器函数语句和遗留的生成器函数表达式被移除。传统的生成器函数语法重用了 function 关键字,当主体中有一个或多个 yield 表达式时,它自动成为生成器函数——现在这是一个语法错误。使用 function* 语句 function* 表达式 代替。

    数组推导式和生成器推导式已被移除。

    // 遗留的数组推导式
    [for (x of iterable) x]
    [for (x of iterable) if (condition) x]
    [for (x of iterable) for (y of iterable) x + y]
    // 遗留的生成器推导式
    (for (x of iterable) x)
    (for (x of iterable) if (condition) x)
    (for (x of iterable) for (y of iterable) x + y)