不推薦和廢棄的特性
本頁面列出了 JavaScript 中已棄用(即仍可用但計劃移除)和已廢棄(即不再可用)的特性。
已棄用的功能
這些已廢棄的特性仍然可以使用,但應謹慎使用,因為並非每個 JavaScript 引擎都要求實現它們。您應努力從程式碼中移除它們的使用。
其中一些已廢棄的特性列在 ECMAScript 規範的附錄 B 部分。此部分被描述為“規範可選”——即,Web 瀏覽器宿主必須實現這些特性,而非 Web 宿主則可能不實現。這些特性可能很穩定,因為移除它們將導致向後相容性問題並破壞舊版網站。(JavaScript 的設計目標是“不要破壞網路”。)儘管如此,它們並非跨平臺可移植,並且可能不被所有分析工具支援,因此建議您不要使用它們,正如附錄 B 的引言所述:
…… 本附錄中指定的所有語言特性和行為都具有一個或多個不受歡迎的特徵,如果不存在歷史使用情況,它們將被從本規範中移除。……
…… 程式設計師在編寫新的 ECMAScript 程式碼時,不應使用或假設這些特性和行為的存在。……
其他一些特性,儘管在主規範主體中,也被標記為規範可選,不應依賴。
HTML 註釋
JavaScript 原始碼,如果被解析為指令碼,允許使用類似 HTML 的註釋,就好像指令碼是 <script> 標籤的一部分一樣。
以下程式碼在 Web 瀏覽器中(或使用 V8 引擎的 Node.js)執行時是有效的 JavaScript:
<!-- comment
console.log("a"); <!-- another comment
console.log("b");
--> More comment
// Logs "a" and "b"
<!-- 和 --> 都像 // 一樣,即作為行註釋的開頭。--> 僅在行首有效(為了避免與字尾遞減運算子後跟大於運算子的歧義),而 <!-- 可以出現在行中的任何位置。
RegExp
以下屬性已棄用。這不影響它們在替換字串中的使用。
$1–$9-
任何帶括號的子字串匹配項。
input,$_-
與正則表示式匹配的字串。
lastMatch,$&-
最後匹配的子字串。
lastParen,$+-
最後帶括號的子字串匹配項(如果有)。
leftContext,$`-
最近匹配項之前的子字串。
rightContext,$'-
最近匹配項之後的子字串。
警告:避免使用這些靜態屬性,因為它們在與外部程式碼互動時可能導致問題!
compile() 方法已棄用。請改用新的 RegExp 例項。
以下正則表示式語法已棄用,並且僅在非 Unicode 模式下可用。在 Unicode 感知模式下,它們都是語法錯誤:
- 先行斷言可以帶量詞。
- 不引用現有捕獲組的反向引用將成為舊版八進位制轉義序列。
- 在字元類中,如果一個邊界是字元類,則字元範圍中的
-會成為字面字元。 - 未識別的轉義序列將成為“標識轉義”。
- 在字元類中,形式為
\cX(其中X是數字或_)的轉義序列的解碼方式與ASCII字母的解碼方式相同:\c0與\cP模 32 的結果相同。此外,如果\cX的形式在任何地方出現,而X不是可識別的字元之一,則反斜槓將被視為字面字元。 - 在不包含任何命名捕獲組的正則表示式中,序列
\k被視為標識轉義。 - 語法字元
]、{和}可以字面出現,而無需轉義,如果它們不能被解釋為字元類或量詞分隔符的結尾。
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()方法受到千年蟲問題的影響,已被getFullYear和setFullYear取代。toGMTString()方法已棄用。請改用toUTCString()。
轉義序列
- 八進位制轉義序列(後跟一個、兩個或三個八進位制數字的
\)在字串和正則表示式字面量中已棄用。 escape()和unescape()函式已棄用。請改用encodeURI()、encodeURIComponent()、decodeURI()或decodeURIComponent()來編碼和解碼特殊字元的轉義序列。
語句
with 語句已棄用,並且在嚴格模式下不可用。
for...in 迴圈頭部中 var 宣告的初始化器已棄用,並且在嚴格模式下會產生語法錯誤。初始化表示式會被評估並賦值給變數,但該值會在迴圈的第一次迭代時立即被重新賦值。
通常,try...catch 語句的 catch 塊不能包含與 catch() 中繫結的變數同名的任何變數宣告。一個擴充套件語法允許 catch 塊包含一個與 catch 繫結識別符號同名的 var 宣告變數,但前提是 catch 繫結是一個簡單的識別符號,而不是一個解構模式。然而,這個變數的初始化和賦值只會作用於 catch 繫結的識別符號,而不是上層作用域變數,並且行為可能令人困惑。
var a = 2;
try {
throw new Error();
} catch (a) {
var a = 1; // This 1 is assigned to the caught `a`, not the outer `a`.
}
console.log(a); // 2
try {
throw new Error();
// 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 塊中宣告的變數之間存在任何名稱衝突。
已廢棄的特性
這些已廢棄的特性已從 JavaScript 中完全移除,並且自所示 JavaScript 版本起不再可用。
RegExp
以下現在是 RegExp 例項的屬性,不再是 RegExp 建構函式的屬性。
| 屬性 | 描述 |
|---|---|
global |
是否針對字串中的所有可能匹配項測試正則表示式,或者僅針對第一個匹配項。 |
ignoreCase |
嘗試在字串中匹配時是否忽略大小寫。 |
lastIndex |
下一個匹配開始的索引。 |
multiline (也透過 RegExp.$*) |
是否在多行字串中搜索。 |
source |
模式的文字。 |
valueOf() 方法不再專門用於 RegExp。它使用 Object.prototype.valueOf(),後者返回自身。
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() |
移除屬性上的 watch 處理程式。 | Proxy |
String
- 非標準的 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 通用方法,如
Array.slice(myArr, 0, 12)、Array.forEach(myArr, myFn)等,在 Firefox 1.5 (JavaScript 1.6) 中引入,在 Firefox 68 中棄用,並在 Firefox 71 中移除。您可以改用Array.prototype上的方法與Function.call結合使用。
Number
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已廢棄。
語句
獲取源文字
陣列、數字、字串等的 toSource() 方法和 uneval() 全域性函式已廢棄。請改用 toString(),或編寫您自己的序列化方法。
舊版生成器和迭代器
舊版生成器函式語句和舊版生成器函式表示式已移除。舊版生成器函式語法重用 function 關鍵字,當函式體內有一個或多個 yield 表示式時,它會自動成為生成器函式——這現在是一個語法錯誤。請改用 function* 語句和 function* 表示式。
陣列推導和生成器推導已移除。
// 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 物件。這個舊版迭代器協議與標準迭代器協議的不同之處在於:
- 值直接作為
next()呼叫的返回值返回,而不是作為IteratorResult物件的value屬性。 - 迭代終止透過丟擲
StopIteration物件來表示,而不是透過IteratorResult物件的done屬性。
此特性以及 StopIteration 全域性建構函式已在 Firefox 58+ 中移除。為了面向未來的使用,請考慮使用 for...of 迴圈和迭代器協議。
Sharp 變數
Sharp 變數已廢棄。為了建立迴圈結構,請改用臨時變數。