JavaScript 的語法大量借鑑了 C 及其餘類 C 語言(如 Java 和 Perl)的語法。所以,熟悉這些語言的開發人員在接受 JavaScript 更加寬鬆的語法時,必定會有種輕鬆自在的感受。本章主要按照 ECMAScript 3 介紹這門語言的基本概念,並就 ECMAScript 5 的變化給出說明。javascript
JavaScript 程序是用 Unicode 字符集編寫的,Unicode 是 ASCII 和 Latin-1 的超集,並支持地球上幾乎全部在用的語言。ECMAScript 3 要求 JavaScript 的實現必須支持 Unicode 2.1及後續版本,ECMAScript 5 則要求支持 Unicode 3及後續版本。html
擴展閱讀「Unicode 與 JavaScript 詳解」
www.ruanyifeng.com/blog/2014/1…java
JavaScript 是區分大小寫的。也就是說,關鍵字、變量、函數名和全部的標識符(identifier)都必須採起一致的大小寫形式。好比,關鍵字 while
必須寫成 while
,而不能寫成 While
或者 WHILE
。一樣,online
、Online
、OnLine
、ONLINE
是4個不一樣的變量名。git
但須要注意的是,HTML 並不區分大小寫。因爲它和客戶端 JavaScript 聯繫緊密,所以這點區別很容易混淆。許多客戶端 JavaScript 對象和屬性與他們所表示的 HTML 標籤和屬性名相同。在 HTML 中,這些標籤和屬性名可使用大寫也能夠是小寫,而在 JavaScript 中則必須是小寫。例如,在 HTML 中設置事件處理程序時,onclick
屬性能夠寫成 onClick
,但在 JavaScript 代碼中,必須使用小寫的 onclick
。github
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 中的一些不肯定的行爲將獲得處理,並且對某些不安全的操做也會拋出錯誤。要在整個腳本中啓用嚴格模式,能夠在頂部添加以下代碼:less
"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…,獲取最新動態。