JavaScript/詞法結構
- 語言中的所有元素都區分大小寫,例如:
const x = 0; const X = 0;定義了兩個不同的變數;CONST x = 0;會導致語法錯誤。 - 單行註釋以
//開頭。多行註釋用/* */括起來。 - 語句末尾的分號是可選的 - 除了少數例外。
- 變數名的第一個字元不能是數字:
const 1x = 0;會導致語法錯誤。
JavaScript 區分大小寫。這意味著所有關鍵字、變數名和函式名必須一致地書寫。如果你建立一個函式 Hello(),它與函式 HELLO()、hello() 或 hEllo() 不同。或者,語句 IF (x > 0) { } 會導致語法錯誤,因為關鍵字 if 是小寫定義的。
空白符包括空格、製表符和換行符。[註釋 1] 如果存在多個空白符的序列,JavaScript 會將它們縮減為一個空白符,例如:' ' -> ' ','\n\t' -> '\n'。這個剩下的單個空白符用於將語言元素(如關鍵字和變數名)彼此分隔。對於人類來說,這樣生成的原始碼難以閱讀[2],但對於瀏覽器來說(稍微)更容易解析。主要優勢是程式碼的大小更小,需要在伺服器和客戶端之間傳輸。
以下指令碼是一個空白符很少的示例。
function filterEmailKeys(event){
event=event||window.event;
const charCode=event.charCode||event.keyCode;
const char=String.fromCharCode(charCode);
if(/[a-zA-Z0-9_\-\.@]/.exec(char)){return true;}
return false;
}
以下是具有典型空白符數量的相同指令碼。
以下是具有典型空白符數量的相同指令碼。
function filterEmailKeys(event) {
event = event || window.event;
const charCode = event.charCode || event.keyCode;
const char = String.fromCharCode(charCode);
if (/[a-zA-Z0-9_\-\.@]/.exec(char)) {
return true;
}
return false;
}
以下是具有大量空白符的相同指令碼。
function filterEmailKeys( evt ) {
evt = evt || window.event;
const charCode = evt.charCode || evt.keyCode;
const char = String.fromCharCode ( charCode );
if ( /[a-zA-Z0-9_\-\.@]/.exec ( char ) ) {
return true;
}
return false;
}
註釋是原始碼的一部分,根據定義 - 不會被執行。
它們允許你在程式碼中留下注釋以幫助其他人理解它。它們還允許你註釋掉你想要隱藏在解析器之外但不想刪除的程式碼。
- 單行註釋
雙斜槓 // 會將同一行上的所有後續文字轉換為註釋,這些註釋不會被 JavaScript 直譯器處理。
// Show a welcome message
alert("Hello, World!")
- 多行註釋
多行註釋以 /* 開頭,並以相反的 */ 結尾。多行註釋不會巢狀。
以下是如何使用不同型別的註釋技術的示例。
/* This is a multi-line comment
that contains multiple lines
of commented text. */
let a = 1;
/* commented out to perform further testing
a = a + 2;
a = a / (a - 3); // is something wrong here?
*/
alert('a: ' + a);
/* This comment has two /* but they're both canceled out by */
在許多程式語言中,每個程式碼語句的末尾都需要分號。在 JavaScript 中,分號的使用是可選的,因為換行符表示語句的結束(除了一些例外)。這被稱為 自動分號插入。
// the line
x = a + b;
// is equivalent to:
x = a + b
但是,這些例外可能令人驚訝。[3] 自動分號插入可能會導致難以除錯的問題。
a = b + c
(d + e).print()
上面的程式碼不會被解釋為兩個語句。由於第二行上的括號,JavaScript 會將上面的程式碼解釋為
a = b + c(d + e).print();
而你可能本意是將其解釋為
a = b + c;
(d + e).print();
即使分號是可選的,最好在語句末尾加上分號,以防止出現任何誤解。
字面量是一個硬編碼的值。字面量提供了一種在指令碼中表達特定值的方法。例如,在等號右邊
const myLiteral = "a fixed value";
有幾種型別的字面量可用。最常見的是字串字面量,但還有數字字面量、布林值、未定義、空值、正則表示式字面量、陣列字面量和物件字面量。
物件、布林值和字串字面量的示例
const myObject = { name:"value", anotherName:"anotherValue" };
const isClosed = true;
const mayBeWrong = "true";
這些不同型別的詳細資訊將在 變數和型別 中介紹。
識別符號是資料片段(如變數、陣列或函式)的名稱。有一些規則
- 識別符號中允許使用字母、美元符號、下劃線和數字。
- 第一個字元不能是數字。
有效識別符號的示例
u$hello_Hellohello90
1A2B3C 是一個無效的識別符號,因為它以數字開頭。
“識別符號”的一個例子是變數名。它們遵循這樣的規則。
- 可以使用大寫和小寫字母、下劃線和美元符號。
- 數字可以在第一個字元之後使用。
- 只要它們分別具有“ID_Start”或“ID_Continue”的 Unicode 屬性,就可以在變數名中使用非拉丁字元(如“á”)。[4] 不允許使用特殊字元。
- 變數名區分大小寫:不同的情況意味著不同的名稱。
- 變數不能是保留字。
- ↑ ECMAScript 語言規範,第 12.2 章 - 空白符
- ↑ 可汗學院
- ↑ ECMA-262 ECMAScript 語言規範,第 12.9 章 - 自動分號插入
- ↑ ECMAScript 語言規範,IdentifierName 生成