在 JavaScript 中,有7個錯誤物件,它們根據錯誤類型在 try/catch 表達式中引發:

  • Error
  • EvalError
  • RangeError
  • ReferenceError
  • SyntaxError
  • TypeError
  • URIError

讓我們分析每個錯誤物件。

Error

這是一個通用的錯誤,所有其他錯誤物件都繼承自它。你永遠不會直接看到 Error 的實例,而是 JavaScript 會引發列在上面的其他錯誤之一,這些錯誤繼承自 Error

它包含兩個屬性:

  • message:錯誤描述,一個可讓人理解的訊息,解釋發生了哪種錯誤
  • name:錯誤類型(具體錯誤物件的名稱,例如 TypeErrorSyntaxError

它只提供一個方法 toString(),負責將錯誤轉換為有意義的字串,可用於將其顯示在螢幕上。

EvalError

這種錯誤在現代 JavaScript 中已被定義,但實際上從未由 JavaScript 拋出,僅僅是出於相容性的目的而保留。它在 ECMAScript 3 中被定義,但在 ECMAScript 5.1 中的標準中已經不存在了。

它用於指示全域函數 eval() 的使用方式不正確,與其定義不兼容。

RangeError

當數字值不在其允許值的範圍內時,會引發 RangeError 錯誤。

最簡單的例子是將陣列長度設置為負值:

[].length = -1 //RangeError: Invalid array length

或者將其設置為大於 4294967295 的數字:

[].length = 4294967295 //4294967295
[].length = 4294967296 //RangeError: Invalid array length

(此魔術數字在 JavaScript 規範中被指定為32位無符號整數的最大範圍,相當於 Math.pow(2, 32) - 1

以下是在實務中可能遇到的最常見的範圍錯誤:

ReferenceError

ReferenceError 指示檢測到無效的引用。一個 JavaScript 程序試圖讀取不存在的變量。

dog //ReferenceError: dog is not defined
dog = 2 //ReferenceError: dog is not defined

需要注意的是,如果不在嚴格模式下運行,上述語句將在全域對象上創建一個 dog 變量。

以下是在實務中可能遇到的最常見的引用錯誤:

SyntaxError

在程式中發現語法錯誤時會引發 SyntaxError

以下是一些會產生語法錯誤的程式碼示例。

沒有名字的函式語句:

function() {
 return 'Hi!'
}
//SyntaxError: function statement requires a name

在物件屬性定義後缺少逗號:

const dog = {
 name: 'Roger'
 age: 5
}
//SyntaxError: missing } after property list

以下是你可能在實務中遇到的最常見的語法錯誤:

TypeError

TypeError 發生在一個值的類型與預期類型不同的情況下。

最簡單的例子是嘗試調用一個數字:

1() //TypeError: 1 is not a function

以下是你可能在實務中遇到的最常見的類型錯誤:

URIError

此錯誤是在調用使用 URI 的全局函數時引發的,例如:

  • decodeURI()
  • decodeURIComponent()
  • encodeURI()
  • encodeURIComponent()

並傳遞一個無效的 URI。