JavaScript语法

**JavaScript 語法**是編寫該語言程序的一套規則。

JavaScript 標準庫缺少官方標準的文本輸出函數（除了 `document.write`）。由於 JavaScript 主要用於在現代網頁瀏覽器上執行客戶端腳本，幾乎所有瀏覽器都支持 `alert` 函數。下述舉例中使用標準文本輸出的 console 對象的 log 函數。

## 起源

布蘭登・艾克在 JavaScript 1.1 規範的第一段中總結如下：

> JavaScript 從 Java 借來了大部分語法，但也從 Awk 和 Perl 繼承，在其對象原型系統中還受到 Self 的一些間接影響。
> 
> 

## 基礎

### 大小寫敏感

JavaScript 是大小寫敏感的。經常以一個大寫字母開始構造函數的名稱 ，一個小寫字母開始函數或變量的名字。

例子：

### 空白和分號

不像在 C 語言中，JavaScript 原始碼中的空白可以直接影響形式語義學。JavaScript 里的語句用分號結束。因為自動分號插入（ASI），也就是說，一些符合語法規則的的語句在分析到換行符時會被認為是完整的，如同在換行符前面插入了一個分號。一些當局建議顯式地寫結束語句的分號，因為它也許會減少自動分號插入未曾預料的效果。

有兩個問題：有五個符記既能開始一條語句，也能擴展一條完整的語句；以及五個受限的語句（production），其中換行在一些位置不被允許，潛在可能會產生不正確的解析。

五個有問題的符記是左圓括號「`(`」，左方括號「`[`」，斜線「`/`」，加號「`+`」，減號「`-`」。當然，左圓括號在立即調用函數表達式模式中很常見，左方括號有時出現，其他幾個就很少了。規範中給出的示例是：

有建議前面的語句以分號結束。
有些人建議在以「`(`」或「`[`」開始的行，使用_前導_分號，讓這行不會意外地與上一行連接。這被稱為**防禦性分號**，特別推薦，因為否則在重新排列代碼時可能變得模稜兩可。例如：

最初的分號有時也在 JavaScript 庫中使用，在它們被追加到另一個省略尾部分號的庫的情況下，因為這可能會導致初始語句的模糊不清。
五個受限的語句是 `return`，`throw`，`break`，`continue`，和後導遞增或遞減。在所有情況里，插入分號不會解決問題，但使得解析的語法更加清晰，錯誤更加容易檢測。`return` 和 `throw` 取一個可選的值，`break` 和 `continue` 取一個可選的標籤。所有情況下，都建議使值或標籤和語句保持在一行上。最多的情況是返回語句，一個人可能想返回一個大的對象文字，它可能意外地被放在了新行上。對於後導遞增或遞減，有可能與前綴遞增或遞減模稜兩可，所以再一次推薦把這些放在同一行。 

### 注釋

注釋語法和 C++,Swift, 和許多其他程式語言相同。

## 變量

標準 JavaScript 中的變量沒有附加類型，因此任何值（每個值都有一個類型）可以存儲在任何變量中。從 ES6（該語言的第 6 版）開始，變量可以用 `var` 聲明函數範圍變量，而 `let` 或 `const` 用於塊級變量。在 ES6 之前，變量只能用 `var` 語句聲明。分配給用 `const` 聲明的變量的值不能更改，但其屬性可以。變量的標識符必須以字母、下劃線 (`_`) 或美元符號 (`$`) 開頭，而後續字符也可以是數字 (`0-9`)。JavaScript 區分大小寫，因此大寫字符「A」到「Z」與小寫字符「a」到「z」不同。

從 JavaScript1.5 開始，可以在標識符中使用 ISO 8859-1 或 Unicode 字符（或 `\uXXXX`Unicode 轉義序列）。在某些 JavaScript 實現中，可以在標識符中使用 at 符號 (@)，但這與規範相反，並且在較新的實現中不受支持。

### 作用域和提升

用 `var` 聲明的變量是在函數級別的詞法作用域，而用 `let` 或 `const` 聲明的變量具有塊級作用域。由於聲明是在任何代碼執行之前處理的，因此可以在代碼中聲明之前分配和使用變量。這被稱為**提升**(hoisting)，它相當於在函數或塊的頂部前向聲明的變量。

對於 `var`、`let` 和 `const` 語句，只有聲明被提升；賦值未被提升。因此，函數中間的 `var x = 1` 語句等效於函數頂部的 `var x` 聲明語句，以及函數中間該點的 `{{{1}}}` 賦值語句。這意味著值在聲明之前不能被訪問；前向引用 (forward reference) 是不可能的。使用 `var` 變量的值在初始化之前是未定義的 (`undefined`)。使用 `let` 或 `const` 聲明的變量在初始化之前無法訪問，因此之前引用此類變量會導致錯誤。

函數聲明，它聲明一個變量並為其分配一個函數，類似於變量語句，但除了可以提升聲明之外，它們還提升了賦值 —— 就好像整個語句出現在包含的函數的頂部一樣 —— 因此前向引用 (forward reference) 也是允許的：函數語句在包含它的函數中的位置是不相關的。這不同於在 `var`、`let` 或 `const` 語句中將函數表達式賦值給變量。

因而，如：

塊作用域可以通過將整個塊包裝在一個函數中然後執行它來產生 —— 這被稱為立即調用函數表達式模式 —— 或者通過使用 `let` 關鍵字聲明變量。

### 聲明和賦值

在作用域外聲明的變量是全局變量。如果一個變量在更高的作用域中聲明，它可以被子作用域 (child scope) 訪問。

當 JavaScript 嘗試解析標識符時，它會在本地作用域內查找。如果沒有找到這個標識符，它會在下一個外部作用域中查找，依此類推，直到抵達全局變量所在的全局作用域。如果仍未找到，JavaScript 將引發 `ReferenceError` 異常。

給標識符賦值時，JavaScript 會通過完全相同的過程來獲取此標識符；但如果在全局範圍內找不到它，將在創建的作用域內創建「變量」。因此，如果給未聲明的變量賦值，會被創建為一個全局變量。在全局範圍內（即在任何函數體之外或在 `let/const` 的情況下為塊）聲明一個變量（使用關鍵字 `var`），或者給一個未聲明的標識符賦值，或向全局對象（通常是窗口）添加一個屬性，這將創建一個新的全局變量。

請注意，JavaScript 的嚴格模式 (strict mode) 禁止給未聲明的變量賦值，從而避免了全局命名空間污染。

### 例子

變量聲明和作用域的一些例子：

## 基本數據類型

JavaScript 語言提供 6 種基本數據類型:

* Undefined
* Number
* BigInt
* String
* Boolean
* Symbol

一些基本數據類型還提供一組命名值來表示類型邊界的範圍。這些命名值在下面的相應子節中描述。

### Undefined

「undefined」值被賦值給所有未初始化變量，在查看不存在的對象屬性時也返回這個值。在布爾上下文中，未定義值被認為是假值。

注意： undefined 被認為是真正的基本數據類型。 除非顯式轉換，否則與在邏輯上下文中評估為 false 的其他類型相比，未定義的值可能會出現不可預料的行為。

注意：沒有內建的語言字面量用於 undefined。因此 `(x === undefined)` 並不是一個萬無一失的放式檢查一個變量是否為 undefined，因為在 ECMAScript 5 之前的版本，如果寫代碼 `var undefined = "I'm defined now";` 是合法的。更魯棒的比較方法是 `(typeof x === 'undefined')`.

下屬函數不會如期望那樣工作：

調用 `isUndefined(my_var)` 會拋出 ReferenceError，如果 my\_var 是未知標識符，但 `typeof my\_var === 'undefined'` 不會拋出異常。

### Number

Number 數據類型表示 IEEE-754 浮點雙精度。不能精確表示一些實數或分數。如：

因此，無論何時格式化輸出，都應使用諸如 toFixed() 方法之類的例程對數字進行捨入。

數字可以用這些符號中的任何一種來指定：

ES2021 引入了數字分隔符 \_ (the underscore)：

Number 類型的範圍 **+∞**, **−∞**和 **NaN**(Not a Number) 可以通過兩個程序表達式獲得：

Infinity 和 NaN 是數字：

這三個特殊值對應並按照 IEEE-754 描述的方式運行。

Number 構造函數（用作函數），或一元 + 或 - 可用於執行顯式數值轉換：

當用作構造函數時，會創建一個數值包裝對象（儘管它用處不大）：

但是，NaN 不等於自身：

### BigInt

BigInts 可用於任意大的整數。特別是大於 253 - 1 的整數，這是 JavaScript 可以用 Number 原語可靠表示的最大數字，並由 Number.MAX\_SAFE\_INTEGER 常量表示。

Math 的方法不支持 BigInt。

JSON.stringify 不支持 BigInt，需要 `BigInt.prototype.toJSON = function() { return this.toString(); }` 後就可以支持。

toString 方法支持 BigInt，radix 有效值是 [2,36]，默認是 10。

BigInt 除法，結果會被截斷為整數，不是浮點數。如：`100n/7n;` 結果為 14n，不是浮點數。

### String

JavaScript 中的字符串是一個字符序列。在 JavaScript 中，可以通過將一系列字符放在雙引號 (") 或單引號 (') 之間直接創建字符串（作為字面量）。此種字符串必須寫在單行上，但可包含轉義的換行符（如 \n). JavaScript 標準允許反引號字符（`，即重音符或反撇號）引用多行字符串字面量，但這僅在 2016 年開始的某些瀏覽器上支持：Firefox 和 Chrome，但 Internet Explorer 11 不支持。

可以使用 charAt 方法（由 String.prototype 提供）訪問字符串中的單個字符。這是訪問字符串中的單個字符時的首選方式，因為它也適用於非現代瀏覽器：

在現代瀏覽器中，可以通過與數組相同的表示法訪問字符串中的單個字符：

但是，JavaScript 字符串是不可變的：

如果字符串具有相同的內容，則將相等運算符 ("==") 應用於兩個字符串將返回 true，這意味著：具有相同的長度並包含相同的字符序列（大小寫對字母很重要）。因此：

除非轉義，否則不能嵌套相同類型的引號：

String 構造函數創建一個字符串對象（一個包裝字符串的對象）：

這些對象有一個 valueOf 方法，返回包裝在其中的原始字符串：

兩個 String 對象之間的相等與字符串原語不同：

### Boolean

JavaScript 提供了一個帶有真假字面量的布爾數據類型。typeof 運算符為這些基本類型返回字符串「"boolean"」。 在邏輯上下文中使用時，由於自動類型轉換，0、-0、null、NaN、undefined 和空字符串 ("") 求值為 false。 所有其他值（前一個列表的補集）求值為 true，包括字符串 "0"、"false" 和任何對象。

### 類型轉換

使用類型檢查的比較運算符 (`===` 和 `!==`) 可以避免相等比較運算符 (`==` 和 `!=`) 的自動類型強制 (type coercion)。

當需要類型轉換時，JavaScript 會按如下方式轉換 Boolean、Number、String 或 Object 操作數：

**Number 和 String**
: 字符串被轉換為數字值。 JavaScript 嘗試將字符串數字字面量轉換為數字類型的值。首先，從字符串數字字面量推導出數學值。接下來將此值四捨五入到最接近的數字類型值。

**Boolean**
: 如果其中一個操作數是布爾值，則該布爾操作數如果為 true 則轉換為 1，如果為 false 則轉換為 0。

**Object**
: 如果將對象與數字或字符串進行比較，JavaScript 會嘗試返回該對象的默認值。使用對象的.valueOf() 或.toString() 方法將對象轉換為基本 String 或 Number 值。如果失敗，則會生成運行時錯誤。

道格拉斯・克羅克福特提倡用「truthy」和「falsy」來描述各種類型的值在邏輯上下文中的行為方式，特別是在邊緣情況下。在 JavaScript 的早期版本中，二元邏輯運算符返回一個布爾值，但現在它們返回一個操作數。在合取 (`a && b`) 時，如果左操作數為 false，則返回左操作數；或在析取 (`a || b`) 時，如果左操作數為 true，則返回左操作數；否則返回右操作數。對於混合了布爾操作數和 number 兼容操作數（包括可以計算為 number 的字符串，或可以計算為此類字符串的對象），比較運算符的自動類型強制可能會有所不同，因為布爾操作數將作為一個數值被比較。這可能出乎意料。表達式可以通過雙重邏輯否定運算符：(!!)、使用 Boolean() 函數或使用條件運算符：(`c ? t : f`) 顯式轉換為布爾基本類型。

new 運算符可用於為布爾基本類型創建對象包裝器。但是，typeof 運算符不返回對象包裝器的 boolean，它返回 object。因為所有對象都求值為 true，所以必須使用諸如.valueOf() 或.toString() 之類的方法來檢索包裝的值。對於 Boolean 類型的顯式強制，Mozilla 建議優先使用 Boolean() 函數（沒有 new）而不是 Boolean 對象。

### Symbol

ECMAScript6 引入的新類型。一個 _Symbol_ 是獨一無二且不可變的標識符。

例如：

存在 _well known symbols_。其中一個是 `Symbol.iterator`; 如果程序實現了 `Symbol.iterator`，則它是可迭代的：

## 原生對象

JavaScript 語言提供了一些原生對象 (native object)。JavaScript 原生對象被認為是 JavaScript 規範的一部分。 儘管有 JavaScript 環境，但這組對象應該始終可用。

### Array

數組 (array) 是從 `Array` 構造函數原型化的 JavaScript 對象，專門設計用於存儲由整數鍵索引的數據值。數組與基本的 Object 類型不同，它是具有方法和屬性的原型，以幫助程式設計師完成日常任務（例如，`join`, `slice` 和 `push`）。

與 C 語言家族的程式語言一樣，數組使用從零開始的索引方案：通過 `push` 方法插入空數組的值占據數組的第 0 個索引。

數組有一個 `length` 屬性，保證總是大於數組中使用的最大整數索引。如果創建具有更大索引的屬性，它會自動更新。將較小的數字寫入 `length` 屬性將刪除較大的索引。

可以使用普通對象屬性訪問表示法訪問 `Array` 的元素：

以上兩個是等價的。 不能使用「點」表示法或帶有替代數字表示的字符串：

聲明一個數組可用 `Array` 字面量或者 `Array` 構造函數:

數組實現為「稀疏數組」，只有定義的元素占用了內存。設置 `myArray[10] = 'someThing'` 和 `myArray[57] = 'somethingOther'` 只為這兩個元素分配了內存空間，這與任何其他對象一樣。數組的 `length` 仍報告為 58。數組的最大長度為 4,294,967,295，對應於 32 位二進位無符號數 (11111111111111111111111111111111)2。

可以使用對象聲明字面量來創建其行為類似於其他語言中的關聯數組對象：

可以使用對象和數組聲明字面量來快速創建關聯數組、多維數組或兩者兼有的數組。從技術上講，JavaScript 不支持多維數組，但可以使用數組數組來模仿它們：

### Date

`Date` 對象存儲有符號的毫秒計數，零表示 1970-01-01 00:00:00 UT，值域為 ±108 天。有幾種方法可以為 `Date` 構造函數提供參數。注意，月份是從零開始的。

提供了抽取欄位的方法，以及有用的 `toString`:

### Error

用 `Error` 類可以創建定製的錯誤消息:

這可被 try...catch...finally 塊捕獲。將在異常處理節中詳述。

### Math

The Math object contains various math-related constants (for example, ) and functions (for example, cosine). (Note that the object has no constructor, unlike or . All its methods are "static", that is "class" methods.) All the trigonometric functions use angles expressed in radians, not degrees or grads.
Math 對象包含各種與數學相關的常數（例如，π）和函數（例如，餘弦）。 請注意，與 Array 或 Date 不同，Math 對象沒有構造函數。它的所有方法都是「靜態的」，即「類」方法。所有三角函數都使用以弧度表示角度，而不是度數或百分度。

### 正則表達式

#### 字符類

#### 字符匹配

#### 重複

#### Anchors

#### 子表達式

#### Flag

#### 高級方法

#### Capturing group

### 函數

JavaScript 的每個函數是 `Function` 構造符的一個實例。當然還有 async /generator 函數構造符：(async ()=>{}) 構造符得到 AsyncFunction, (async function\*(){}) 構造符得到 AsyncGeneratorFunction, (function\*(){}) 構造符得到 GeneratorFunction。

上述加法函數也可定義為函數表達式:

ES6 中，增加了箭頭函數語法 (arrow function syntax)。與 `function() {}` 表達式不同，它們還保留全局對象的 `this` 而不是從調用它的位置 / 調用時的值來繼承它。

對於需要提升的函數，專門的表達式：

提升允許你在聲明之前使用它：

函數實例可具有屬性和方法：

## 運算符

'+' 運算符重載：它用於字符串連接和算術加法。 當無意中混合字符串和數字時，這可能會導致問題。 作為一元運算符，它可以將數字字符串轉換為數字。

類似地， '\*' 運算符也是重載的：可以把字符串轉為數。

### 算術運算符

JavaScript 支持下述**二元算術運算符**：

JavaScript 支持下述**酉算術運算符**:

例如：

模運算符顯示除以模數後的餘數。 如果涉及負數，則返回值取決於操作數。

要始終返回非負數，請重新添加模數並再次應用模運算符:

### 賦值複合運算符

基本類型的賦值：

對象類型的賦值：

#### 解構賦值

```
at its leaves that are to receive the substructures of the assigned value.
```

在 Mozilla 的 JavaScript 中，從 1.7 版開始，解構賦值 (destructuring assignment) 允許一次將部分資料結構賦值給多個變量。 賦值的左側是一個類似於任意嵌套對象 / 數組字面量的模式，在其葉子處包含左值將接收賦值的子結構。

#### 擴展 / 休息運算符

ECMAScript 2015 標準引入了「`...`」運算符，用於「擴展語法」(spread syntax) 和「剩餘參數」(rest parameters) 的相關概念。

**擴展語法**提供了另一種解構數組的方法。 它表示指定數組中的元素應用作函數調用中的參數或數組字面量中的項。

換句話說， "`...`"把"`[...foo]`"變換為"`[foo[0], foo[1], foo[2]]`"，而"`this.bar(...foo);`"變換為"`this.bar(foo[0], foo[1], foo[2]);`"：

當在函數聲明中使用 `...` 時，它表示一個**剩餘參數**(rest parameter)。 剩餘參數必須是函數參數列表中的最右側的命名參數。 它將被賦值一個 `Array`，其中包含傳遞給函數超過其他命名參數的任何多餘的參數。 換句話說，它獲取傳遞給函數的「多餘的」參數（因此得名）。

剩餘參數類似於 Javascript 的 `arguments` 對象，它是一個類似數組的對象，包含當前函數調用中的所有參數（命名和未命名）。 然而，與 `arguments` 參數不同的是，剩餘參數是真正的 `Array` 對象，因此可以直接對它們使用 `.slice()` 和 `.sort()` 等方法。

`...` 運算符只能與 `Array` 對象一起使用。然而，在未來的 ECMAScript 標準中，有人提議將其擴展到 `Object`。)

### 比較運算符

引用對象的變量只有在引用同一個對象時才相等或者相同：

參見 String.

### 邏輯運算符

JavaScript 提供 4 個邏輯運算符：

* 酉運算邏輯非 (`NOT = !a`)
* 二元運算析取 (`OR = a || b`) 與合取 (`AND = a && b`)
* 三元條件運算符 (`c ? t : f`)

在邏輯運算上下文中，除下述表達式外，任何表達式的計算結果都為 true**:**

* 字符串: `""`, `''`,
* 數: `0`, `-0`, `NaN`,
* 特殊: `null`, `undefined`,
* 布爾: `false`.

布爾函數可用於顯式轉換為基礎類型 `Boolean`:

The NOT operator evaluates its operand as a Boolean and returns the negation. Using the operator twice in a row, as a double negative, explicitly converts an expression to a primitive of type Boolean:

三元運算符可用於顯式轉換：

使用後增量 (`i++`) 等特性的表達式具有預期的副作用。 JavaScript 提供了表達式的短路求值； 僅當左操作數不足以確定表達式的值時，右操作數才被執行。

In early versions of JavaScript and JScript, the binary logical operators returned a Boolean value (like most C-derived programming languages). However, all contemporary implementations return one of their operands instead:
在 JavaScript 和 JScript 的早期版本中，二元邏輯運算符返回一個布爾值（就像大多數從 C 派生的程式語言一樣）。但是，所有 Javascript 的當代實現都返回其操作數之一：

更熟悉 C 中的行為的程式設計師可能會發現這個特性令人驚訝，但它允許更簡潔地表達模式，如空值結合運算符：

### 邏輯賦值

### 按位運算符

例如:

JavaScript 支持**酉按位運算符**:

### 位操作賦值

例如:

### 字符串

例如:

### ??

## 控制結構

### 複合語句

一對大括號 `{ }` 和一個封閉的語句序列構成一個複合語句，可以在任何可以使用語句的地方使用。

### If ... else

### 三元調解運算符

條件運算符創建一個表達式，該表達式根據條件計算為兩個表達式之一。 這類似於根據條件選擇兩個語句之一執行的「if」語句。 即，條件運算符之於表達式就像 _if_ 之於語句。

等價於：

與 _if_ 語句不同，條件運算符不能省略其「else-branch」。

### Switch 語句

JavaScript 的 switch 語句如下:

* `break;` 是可選的； 但是，通常需要它，因為否則代碼執行將繼續到下一個案例塊的主體。
* 作為預防措施，在最後一個案例的末尾添加一個 break 語句，以防以後添加其他案例。
* 可用字符串字面量作為 case 值。
* 可以使用表達式代替值。
* 當表達式不匹配任何其他指定的情況時，執行默認情況（可選）。
* 大括號是必需的。

### For 循環

或：

### For ... in loop

* 遍歷對象的所有可枚舉屬性。
* 遍歷數組的所有使用索引，包括數組對象的所有用戶定義屬性（如果有）。 因此，在遍歷數組時，最好使用傳統的 for 循環對索引的所有值循環。
* 不同的 Web 瀏覽器在 for...in 循環語句反映哪些屬性方面存在差異。理論上，這是由 ECMAscript 標準定義的稱為「DontEnum」的內部狀態屬性控制的，但實際上，每個瀏覽器在自省期間返回的屬性集略有不同。使用 `if (some\_object.hasOwnProperty(property\_name)) { ...`} 測試給定屬性很有用。 因此，使用 `Array.prototype.newMethod = function() {...`} 向數組原型添加方法可能會導致 `for ... in` 循環遍歷方法的名稱。

### While 循環

### Do ... while 循環

### With

with 語句將所有給定對象的屬性和方法添加到以下塊的範圍內，讓它們被引用，就好像它們是局部變量一樣。

* 請注意在每次 getElementById() 調用之前缺少 document.。

因為 with 語句的可用性會阻礙程序性能並且被認為會降低代碼的清晰度（因為任何給定的變量實際上可能是封閉 with 的屬性），因此在「嚴格模式」中不允許使用此語句 .

### Label

JavaScript 在大多數實現中都支持嵌套標籤。可以為 break 語句標記循環或塊，為 `continue` 標記循環。雖然 `goto` 是保留字， `goto` 在 JavaScript 中未實現。

## 函數

函數沒有返回語句的情況下，則返回值 undefined。

函數時頭等對象，可以賦值給其他變量。

調用函數時給出的參數數量不一定與函數定義中的參數數量相對應；在調用時沒有匹配實參的命名形參具有值 undefined（可以隱式轉換為 false）。在函數中，參數也可以通過 arguments 對象訪問； 這提供了使用索引訪問所有參數（例如 `arguments[0], arguments[1], ... arguments[n]`），包括那些超出命名參數數量的參數。（雖然參數列表具有 `.length` 屬性，但它不是 Array 的實例；它沒有諸如.slice( )、.sort() 等）

原始值（數字、布爾值、字符串）按值傳遞。 對於對象，它是對傳遞的對象的引用。

函數可以在其他函數內部聲明，並訪問外部函數的局部變量。 此外，即使在外部函數退出後，它們也會通過記住外部函數的局部變量來實現完整的閉包。

### Async/await

## 對象 Object

為方便起見，類型通常被細分為「基本」(primitives) 和「對象」。 對象是具有標識符的實體（它們僅與自身相同）並將屬性名稱映射到值（基於原型編程 術語中的「槽」slot）。 對象可以被認為是 關聯數組或散列 (hash)，並且通常使用這些資料結構來實現。但是，對象具有其他功能，例如原型鏈 (prototype chain)，這是普通關聯數組所沒有的。

JavaScript 有幾種內置對象，分別是 `Array`、`Boolean`、`Date`、`Function`、`Math`、`Number`、`Object`、`RegExp` 和 `String`。 其他對象是「宿主對象」(host object)，不是由語言定義，而是由運行時環境定義。 例如，在瀏覽器中，典型的宿主對象屬於 DOM（窗口、表單、連結等）。

### 創建對象

可以使用構造函數或對象字面量創建對象。構造函數可以使用內置的 Object 函數或自定義函數。按照慣例，構造函數的名稱以大寫字母開頭：

對象字面量和數組字面量允許人們輕鬆創建靈活的資料結構：

這是 JSON 的基礎，它是一種使用類似 JavaScript 的語法進行數據交換的簡單表示法。

### 方法

method 是一個已分配給對象的屬性名稱的函數。與許多物件導向的語言不同，在與對象相關的 JavaScript 中，函數定義和方法定義沒有區別。相反，區別發生在函數調用期間。函數可以作為方法調用。

當作為方法調用時，標準局部變量 _this_ 會自動設置為 "." 左側的對象實例。（還有 _call_ 和 _apply_ 方法可以顯式設置 _this_ - 一些包，例如 jQuery 用 _this_ 做不尋常的事情。）

在下面的示例中，Foo 被用作構造函數。構造函數沒有什麼特別之處 —— 它只是一個初始化對象的普通函數。當與 _new_ 關鍵字一起使用時，通常情況下，_this_ 設置為新創建的空白對象。

請注意，在下面的示例中，Foo 只是為槽分配值，其中一些值是函數。因此它可以為不同的實例分配不同的功能。此示例中沒有原型設計。

### 構造函數

構造函數只需將值分配給新創建對象的槽。 這些值可以是數據或其他函數。

示例：操作對象：

構造函數本身在對象原型的「構造函數」槽中被引用。 所以，

函數本身就是對象，可以用來產生類似於「靜態屬性」（使用 C++/Java 術語）的效果，如下所示。（函數對象還有一個特殊的 `prototype` 屬性，如下面的「繼承」部分所述。）

對象刪除很少使用，因為腳本引擎將垃圾收集不再被引用的對象。

### 繼承

JavaScript 以 Self 的方式通過原型設計 (prototyping) 支持繼承層次結構。

在以下示例中，Derived 類繼承自 Base 類。當 d 創建為 Derived 時，對 Base 基礎實例的引用被複製到 d.base。

Derive 不包含 aBaseFunction 的值，因此在訪問 aBaseFunction 時從 aBaseFunction 檢索它。 這可以通過改變 base.aBaseFunction 的值來明確，這反映在 d.aBaseFunction 的值中。

一些實現允許使用 \_\_proto\_\_ 槽顯式訪問或設置原型，如下所示。

下面清楚地顯示了在實例創建時對原型的引用是如何「複製」的，但是對原型的更改會影響引用它的所有實例。

在實踐中，使用了這些主題的許多變體，它可能既強大又令人困惑。

## 異常處理

JavaScript 包含一個 `try ... catch ... finally` 異常處理 語句來處理運行時錯誤。

`try ... catch ... finally` 語句捕獲由錯誤或 throw 語句導致的異常。 它的語法如下：

最初，try 塊中的語句執行。如果拋出異常，腳本的控制流會立即轉移到 catch 塊中的語句，異常可用作錯誤參數。否則將跳過 catch 塊。 如果 catch 塊不想處理特定錯誤，它可以 throw(errorValue)。

在任何情況下，finally 塊中的語句都會被執行。這可用於釋放資源，儘管內存會自動進行垃圾回收。

可以省略 catch 或 finally 子句。 catch 參數是必需的。

Mozilla 實現允許多個 catch 語句，作為對 ECMAScript 標準的擴展。它們遵循類似於 Java 中使用的語法：

在瀏覽器中，onerror 比捕獲異常更常用。

## 本地函數與方法

與網頁瀏覽器不相關。

### eval (表達式)

將第一個參數計算為表達式，其中可以包括賦值語句。 表達式可以引用函數的局部變量。 但是，`eval` 代表了主要的安全風險，因為它允許不良行為者執行任意代碼，因此不鼓勵使用它。

## 參考文獻

## 進一步閱讀

* Danny Goodman: _JavaScript Bible_, Wiley, John & Sons, ISBN 0-7645-3342-8.
* David Flanagan, Paula Ferguson: _JavaScript: The Definitive Guide_, O'Reilly & Associates, ISBN 0-596-10199-6.
* Thomas A. Powell, Fritz Schneider: _JavaScript: The Complete Reference_, McGraw-Hill Companies, ISBN 0-07-219127-9.
* Axel Rauschmayer: _Speaking JavaScript: An In-Depth Guide for Programmers_, 460 pages, O'Reilly Media, 25 February 2014, ISBN 978-1449365035. (free online edition （頁面存檔備份，存於網際網路檔案館）)
* Emily Vander Veer: _JavaScript For Dummies, 4th Edition_, Wiley, ISBN 0-7645-7659-3.

## 外部連結

* A re-introduction to JavaScript - Mozilla Developer Center （頁面存檔備份，存於網際網路檔案館）
* JavaScript Loops （頁面存檔備份，存於網際網路檔案館）
* ECMAScript standard references: ECMA-262 （頁面存檔備份，存於網際網路檔案館）
* Interactive JavaScript Lessons - example-based
* JavaScript on About.com: lessons and explanation （頁面存檔備份，存於網際網路檔案館）
* JavaScript Training
* Mozilla Developer Center Core References for JavaScript versions 1.5 （頁面存檔備份，存於網際網路檔案館）, 1.4, 1.3 and 1.2
* Mozilla JavaScript Language Documentation （頁面存檔備份，存於網際網路檔案館）