JavaScript 的語法大量借鑑了 C 及其他類 C 語言(如 Java 和 Perl)的語法。因此,熟悉這些語言的開發人員在接受 JavaScript 更加寬鬆的語法時,一定會有種輕鬆自在的感覺。本章主要按照 ECMAScript 3 介紹這門語言的基本概念,並就 ECMAScript 5 的變化給出說明。
字符集
JavaScript 程式是用 Unicode 字符集編寫的,Unicode 是 ASCII 和 Latin-1 的超集,並支援地球上幾乎所有在用的語言。ECMAScript 3 要求 JavaScript 的實現必須支援 Unicode 2.1及後續版本,ECMAScript 5 則要求支援 Unicode 3及後續版本。
擴充套件閱讀「Unicode 與 JavaScript 詳解」
www.ruanyifeng.com/blog/2014/1…
區分大小寫
JavaScript 是區分大小寫的。也就是說,關鍵字、變數、函式名和所有的識別符號(identifier)都必須採取一致的大小寫形式。比如,關鍵字 while
必須寫成 while
,而不能寫成 While
或者 WHILE
。同樣,online
、Online
、OnLine
、ONLINE
是4個不同的變數名。
但需要注意的是,HTML 並不區分大小寫。由於它和客戶端 JavaScript 聯絡緊密,因此這點區別很容易混淆。許多客戶端 JavaScript 物件和屬性與他們所表示的 HTML 標籤和屬性名相同。在 HTML 中,這些標籤和屬性名可以使用大寫也可以是小寫,而在 JavaScript 中則必須是小寫。例如,在 HTML 中設定事件處理程式時,onclick
屬性可以寫成 onClick
,但在 JavaScript 程式碼中,必須使用小寫的 onclick
。
註釋
JavaScript 使用 C 風格的註釋,包括單行註釋和塊級註釋。單行註釋以兩個斜槓 //
開頭,塊級註釋以一個斜槓和一個星號 /*
開頭,以一個星號和一個斜槓 */
結尾。下面都是合法的 JavaScript 註釋:
// 這裡是單行註釋
/*
* 這裡是塊級註釋
* 也叫多行註釋
*/複製程式碼
雖然上面註釋中的第二和第三行都以一個星號開頭,但這不是必須的,純粹是為了提高註釋的可讀性(這種格式在企業級應用中極其常見)。
字面量
所謂字面量(也可稱直接量,Literal values),就是程式中直接使用的資料值。字面量只代表自身,不儲存在特定位置。JavaScript 中的字面量有:字串、數字、布林值、物件、陣列、函式、正規表示式,以及特殊的 null
值。
"hello world" // 字串
123 // 數字
1.2 // 小數
true // 布林值
false // 布林值
/javascript/gi // 正規表示式
null // 空
{ name: 'stone', age: 20} // 物件
[ 1, 2, 3, 4, 5, 6, 7, 8 ] // 陣列
function(){ console.log('good'); } // 函式複製程式碼
擴充套件閱讀「undefined不是字面量」
www.cnblogs.com/ziyunfei/ar…
嚴格模式
在 ECMAScript 5 引入了嚴格模式(strict mode)的概念。嚴格模式是為 JavaScript 定義了一種不同的解析與執行模式。在嚴格模式下,ECMAScript 3 中的一些不確定的行為將得到處理,而且對某些不安全的操作也會丟擲錯誤。要在整個指令碼中啟用嚴格模式,可以在頂部新增如下程式碼:
"use strict";複製程式碼
這行程式碼看起來像是字串,而且也沒有賦值給任何變數,但其實它是一個編譯指示(pragma),用於告訴支援的 JavaScript 引擎切換到嚴格模式。這是為了不破壞 ECMAScript 3 語法而特意選定的語法。
在函式內部的第一行包含這條編譯指示,也可以指定函式在嚴格模式下執行:
function doSomething(){
"use strict";
// 函式體
}複製程式碼
嚴格模式下,JavaScript 的執行結果會有很大不同,因此本課程會隨時指出嚴格模式下的區別。
識別符號
所謂識別符號,就是指變數、函式、屬性的名字,或者函式的引數。JavaScript 識別符號必須以字母、下劃線(_
)或美元符號($
)開始,後續的字元可以是字母、數字、下劃線或美元符號(數字是不允許作為首字元出現的)。下面是合法的識別符號:
my_variable_name, v12345, _dummy, $str888複製程式碼
識別符號中的字母可以包含擴充套件的 ASCII 或 Unicode 字母字元(如 π
和 ∑
),但不推薦這樣做。按照慣例,JavaScript 識別符號采用駝峰大小寫格式,也就是第一個字母小寫,剩下的每個有意義的單詞的首字母大寫,例如:
firstSecond, myCar, doSomethingImportant複製程式碼
關鍵字和保留字
ECMAScript 3 描述了一組具有特定用途的關鍵字,這些關鍵字可用於表示控制語句的開始或結束,或者用於執行特定操作等。按照規則,關鍵字是語言保留的,不能用作識別符號。以下是 ECMAScript 3 的全部關鍵字:
break delete function return typeof
case do if switch var
catch else in this void
continue false instanceof throw while
debugger finally new true with
default for null try複製程式碼
ECMAScript 3 還將 Java 的所有關鍵字都作為自己的保留字。儘管保留字還沒有任何特定的用途,但他們有可能在將來被用作關鍵字:
abstract double goto native static
boolean enum implements package super
byte export import private synchronized
char extends int protected throws
class final interface public transient
const float long short volatile複製程式碼
ECMAScript 5 把非嚴格模式下的保留字縮減為:
class enum extends super
const export import複製程式碼
ECMAScript 5 在嚴格模式下的保留字為:
implements package public
interface private static
let protected yield複製程式碼
注意,let
和 yield
是 ECMAScript 5 新增的保留字,其他保留字都是 ECMAScript 3 定義的。為了保證相容性,任何時候都不建議使用 ECMAScript 5 新增的保留字 let
和 yield
。
ECMAScript 還預定義了很多全域性變數和函式,也應當避免把它們用作識別符號:
arguments Error Math RegExp
Array eval NaN String
Boolean EvalError Number SyntaxError
Date Function Object TypeError
decodeURI Infinity parseFloat undefined
decodeURIComponent isFinite parseInt URIError
encodeURI isNaN RangeError
encodeURIComponent JSON ReferenceError複製程式碼
JavaScript 的具體實現可能定義獨有的全域性變數和函式,每一種特定的 JavaScript 執行環境都有自己的一個全域性屬性列表,這一點是需要牢記的。
可選的分號
和其他許多變成語言一樣,JavaScript 使用分號(;
)將語句分隔開。這對增強程式碼的可讀性和整潔性是非常重要的。缺少分隔符,一條語句的結束就成了下一條語句的開始,反之亦然。如果語句各自獨佔一行,通常可以省略語句之間的分號(程式結尾或花括號 }
之前的分號也可以省略)。
var sum = a + b // 即使沒有分號也是有效的語句,不好的寫法
var diff = a - b; // 有效的語句,好的寫法複製程式碼
雖然語句結尾的分號不是必須的,但請任何時候都不要省略它。因為加上這個分號可以避免很多錯誤,開發人員也可以放心地通過刪除多餘的空格來壓縮 JavaScript 程式碼。另外,加上分號也會在某些情況下增進程式碼的效能,因為這樣解析解就不必再花時間推測應該在哪插入分號了。
關卡
請判斷以下程式碼是否有效?如果有效請給出結果,如果無效請說明原因。
// 挑戰一
var class = 'person';
console.log(class); // ???複製程式碼
// 挑戰二
var Class = 'person';
console.log(class); // ???複製程式碼
// 挑戰三
var True = false;
console.log(True); // ???複製程式碼
// 挑戰四
var true = false;
console.log(True); // ???複製程式碼
// 挑戰五
var $_$ = 'stone';
console.log($_$); // ???複製程式碼
// 挑戰六
var 00_name = 'stone';
console.log(00_name); // ???複製程式碼
// 挑戰七
var Array = 'null';
console.log(Array); // ???複製程式碼
// 挑戰八
var undefined = 'null';
console.log(undefined); // ???複製程式碼
// 挑戰九
var result = 1 + 2
+ 3 + 4
console.log(result); // ???複製程式碼
更多
關注微信公眾號「劼哥舍」回覆「答案」,獲取關卡詳解。
關注 github.com/stone0090/j…,獲取最新動態。