不推薦和廢棄的特性

本頁面列出了 JavaScript 中已棄用(即仍可用但計劃移除)和已廢棄(即不再可用)的特性。

已棄用的功能

這些已廢棄的特性仍然可以使用,但應謹慎使用,因為並非每個 JavaScript 引擎都要求實現它們。您應努力從程式碼中移除它們的使用。

其中一些已廢棄的特性列在 ECMAScript 規範的附錄 B 部分。此部分被描述為“規範可選”——即,Web 瀏覽器宿主必須實現這些特性,而非 Web 宿主則可能不實現。這些特性可能很穩定,因為移除它們將導致向後相容性問題並破壞舊版網站。(JavaScript 的設計目標是“不要破壞網路”。)儘管如此,它們並非跨平臺可移植,並且可能不被所有分析工具支援,因此建議您不要使用它們,正如附錄 B 的引言所述:

…… 本附錄中指定的所有語言特性和行為都具有一個或多個不受歡迎的特徵,如果不存在歷史使用情況,它們將被從本規範中移除。……

…… 程式設計師在編寫新的 ECMAScript 程式碼時,不應使用或假設這些特性和行為的存在。……

其他一些特性,儘管在主規範主體中,也被標記為規範可選,不應依賴。

HTML 註釋

JavaScript 原始碼,如果被解析為指令碼,允許使用類似 HTML 的註釋,就好像指令碼是 <script> 標籤的一部分一樣。

以下程式碼在 Web 瀏覽器中(或使用 V8 引擎的 Node.js)執行時是有效的 JavaScript:

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

String

Date

轉義序列

語句

with 語句已棄用,並且在嚴格模式下不可用。

for...in 迴圈頭部中 var 宣告的初始化器已棄用,並且在嚴格模式下會產生語法錯誤。初始化表示式會被評估並賦值給變數,但該值會在迴圈的第一次迭代時立即被重新賦值。

通常,try...catch 語句的 catch 塊不能包含與 catch() 中繫結的變數同名的任何變數宣告。一個擴充套件語法允許 catch 塊包含一個與 catch 繫結識別符號同名的 var 宣告變數,但前提是 catch 繫結是一個簡單的識別符號,而不是一個解構模式。然而,這個變數的初始化和賦值只會作用於 catch 繫結的識別符號,而不是上層作用域變數,並且行為可能令人困惑。

js
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

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 結合使用。
屬性 描述 替代方案
Array.observe() 非同步觀察陣列的更改。 Proxy
Array.unobserve() 移除觀察者。 Proxy

Number

Proxy

  • Proxy.createProxy.createFunction 已廢棄。請改用 Proxy() 建構函式。
  • 以下陷阱已廢棄:

ParallelArray

  • ParallelArray 已廢棄。

語句

  • for each...in 已廢棄。請改用 for...of
  • let 塊和 let 表示式已廢棄。
  • 表示式閉包(function () 1 作為 function () { return 1; } 的簡寫)已廢棄。請改用常規函式箭頭函式

獲取源文字

陣列、數字、字串等的 toSource() 方法和 uneval() 全域性函式已廢棄。請改用 toString(),或編寫您自己的序列化方法。

舊版生成器和迭代器

舊版生成器函式語句和舊版生成器函式表示式已移除。舊版生成器函式語法重用 function 關鍵字,當函式體內有一個或多個 yield 表示式時,它會自動成為生成器函式——這現在是一個語法錯誤。請改用 function* 語句function* 表示式

陣列推導和生成器推導已移除。

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 物件。這個舊版迭代器協議與標準迭代器協議的不同之處在於:

  • 值直接作為 next() 呼叫的返回值返回,而不是作為 IteratorResult 物件的 value 屬性。
  • 迭代終止透過丟擲 StopIteration 物件來表示,而不是透過 IteratorResult 物件的 done 屬性。

此特性以及 StopIteration 全域性建構函式已在 Firefox 58+ 中移除。為了面向未來的使用,請考慮使用 for...of 迴圈和迭代器協議

Sharp 變數

Sharp 變數已廢棄。為了建立迴圈結構,請改用臨時變數。