废弃和过时的特性
本附录列出了那些已经废弃(仍然可用,但是已计划删除)或者过时(已被删除,无法使用)的 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
-
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
可能不会很快被删除,但它被定义在 Annex B 中,因此是规范性的可选项。 -
String.prototype.trimLeft
和String.prototype.trimRight
应替换为String.prototype.trimStart
和String.prototype.trimEnd
。 -
getYear()
和setYear()
方法受千年虫问题影响,已并入getFullYear
和setFullYear
中。 -
toGMTString()
方法已被弃用,请使用toUTCString()
方法。 - 在字符串和正则表达式字面中,八进制转义序列(\ 后跟一个、两个或三个八进制数字)被弃用。
-
escape
和unescape
函数已被弃用。使用encodeURI
、encodeURIComponent
、decodeURI
或decodeURIComponent
来对特殊字符的转义序列进行编码和解码。
语句
过时的特性
这些过时的功能已经从 JavaScript 中完全删除,从指定的 JavaScript 版本开始就不能再使用了。
RegExp
以下是
RegExp
实例的属性,不再是
RegExp
构造函数的属性:
valueOf()
方法不再专门用于
RegExp
。它使用
Object.prototype.valueOf()
,并返回它本身。
Function
-
Function 的
arity
属性已经过时,请使用length
代替。
Object
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.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
获取源文本
数组、数字、字符串等的
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)