導讀:我看這本書也已經有好幾遍了,每一次都會發現新的大陸,拍手稱快!為了更進一步的學習一遍,另外也算是把這本書變成我的手冊。把所需要的,好的東西記錄在這里,這樣以后可以一遍又一遍的回顧。祝我在這條路上走得越來越遠。
一、語法
(1) 標識符
標識符是由一個字母開頭,其后可以選擇性的加上一個或多個字母、數字或者下划線。
保留字是不能被使用的,(這在我寫的《深入理解JavaScript》—— Day1里面有寫到)。另外本應該作為保留字的undefined、NaN和Infinity也同樣的不能使用。但是在對象字面量中的屬性名可以使用,但是需要加上引號,並且更糟糕的是不能使用點(.)來訪問,只能使用中括號([])來訪問該屬性名。切記!
var a = { 'NaN' : 'not a number' }; console.log(a['NaN']); // not a number
所以我的建議是不要使用保留字是最好的選擇。
注:標識符被用於語句、變量、參數、屬性名、運算符和標記。
(2) 數字
JavaScript只有一個數字類型。它是內部被表示為64位的浮點數。但是沒有分離出整型類型,所以1和1.0值是相同的。
① 如果數字字面量有指數部分,那么這個字面量的值等於e之前的數字與10的e之后數字的次方相乘。所以100和1e2是相同的。
② 負數可以在前置運算符 - 加數字構成。
③ NaN是一個數值,它表示一個不能產生正常結果的運算結果。NaN不等於任何值,包括它自己。你可以用isNaN來檢測NaN。
④ Infinity表示所有大於1.79769313486231570e+308的值。
⑤ 數字擁有方法。JavaScript有一個對象Math,它包含一套作用於數字的方法。
(3) 字符串
字符串字面量可以被包在一對單引號或者雙引號中它可以包括0個或多個字符。\(反斜杠)是轉義字符。JavaScript在被創建的時候,Unicode是一個16位的字符集,所以JavaScript中所有字符都是16位的。
① JavaScript中沒有字符類型。要表示一個字符,只需要創建僅包含一個字符的字符串即可。
② 轉義字符可以吧那些正常情況下不允許的字符插入到字符串中,比如反斜杠、引號和控制字符。\u 約定用來指定數字字符編碼。
“A” === “\u0041”
③ 字符串有一個length屬性。例如“seven”的length是5。
④ 字符串是不可變的。一旦被創建,就永遠無法改變它。但是你可以通過 + 運算符鏈接其他字符串來創建一個新的字符串。兩個包含相同字符且字符順序相同的字符串也被認為是true。
'a' + 'm' = 'am';
⑥ 字符串也有一些方法。
(3) 語句
一個編譯單元包含一組可執行的語句。在Web瀏覽器中,每個<script>標簽提供一個被編譯且立即執行的編譯單元。
① 當 var 語句被用在函數內部時,它定義的是這個函數的私有變量。
② switch、while、for和do語句允許有一個可選的前置標簽(label),它配合break語句使用。
③ 語句通常按照從上到下的順序被執行。JavaScript可以通過條件語句、循環語句、強制跳轉語句和函數調用來改變執行序列。
④ 代碼塊是包在一對花括號里面的一組語句。不像其他的語言,JavaScript中的代碼塊不會創建新的作用域。因此,定義的變量應該被定義在函數的頭部,而不是在代碼塊中。
⑤ if語句根據表達式的值改變程序流程。表達式的值為真時執行跟在其后的的代碼塊,否則,執行可選的else分支。
⑥ 下面的值被當做假(false):‘’(空字符串)、0、false、 null、undefined、NaN。其他的所有值都是真,其中包括字符串“false”。
⑦ switch語句執行一個多路分支。它把其表達式的值和所有指定的case條件進行匹配。其表達式可能產生一個數字或字符串。當找到一個精確的匹配時,執行匹配的case從句中的語句。如果沒有找到任何匹配,那么執行可選的default語句。
其中一個case從句可以包含一個或多個case語句。case表達式不一定必須是常量。要防止繼續執行下一個case,那么從句后面應該跟隨一個強制跳轉語句。你可以用break退出switch語句。
⑧ while語句執行一個簡單的循環。如果表達式值為假,就終止循環。表達式為真,那么代碼塊被執行。
⑨ for語句是一個更加復雜的循環語句。它有兩種形式。
第一種: 是由3個可選從句控制:初始化語句、條件從句和增量從句。
第二種: 被稱為for-in從句,會枚舉一個對象的所有屬性名。
⑩ do語句就像while語句,唯一的區別就是它在代碼塊執行之后而不是之前檢測表達式的值。這意味着代碼塊至少被執行一次。
11. try語句執行一個代碼塊,並捕獲該代碼拋出的任何異常。catch從句定義一個新的變量來接收拋出的異常。thorw語句拋出一個異常。如果throw語句在一個try代碼塊中,那么控制流會跳轉到catch語句中。如果throw語句在函數中,則該函數調用被放棄,控制流跳轉到調用該函數的try語句的catch從句中。
throw語句中的表達式通常是一個對象字面量,包括一個name屬性和一個message屬性。異常捕獲器可以使用這些信息做些什么。
12. return語句會導致從函數中提前返回。它也可以指定要返回的值。如果沒有指定返回值,那么返回undefined。
注:JavaScript中不允許return關鍵字和表達式之間換行。
13. break語句會使程序退出一個循環語句或switch語句。它可以指定一二可選的標簽,那退出的就是帶該標簽的語句。
注:JavaScript中不允許break關鍵字和標簽之間換行。
(4) 表達式
最簡單的表達式就是字面量值(比如字符串或數字)、變量、內置的值、以new開頭的調用表達式、以delete開頭的屬性提取表達式、包在圓括號中的表達式、以一個前置運算符作為前導的表達式。或者表達式后面跟着:
—— 一個中置運算符與另一個表達式(中置運算符是啥?查了半天也查不到,我還是以后看一遍英文原版的吧)
—— 三元運算符?后面跟着一個表達式,然后一個: ,再接着第3個表達式
—— 一個函數調用
—— 一個屬性提取表達式
① 運算符優先級
. [] () | 提取屬性與調用函數 |
delete new typeof + - ! | 一元運算符 |
* / % | 乘法、除法、求余 |
+ - | 加法/連接符、減法 |
>= <= > < | 不等式運算符 |
=== !== | 等式運算符 |
&& | 邏輯與 |
|| | 邏輯或 |
?: | 三元 |
② typeof的運算值有:number、string、boolean、function、object、undefined。其中null結果是object,這是不對的。我在之前有說過,那么我就不再解釋了。
③ 如果!的運算符的值為真,那么產生false,否則產生true。
④ + 運算符可以進行加法運算符或字符串連接。如果你想要的是加法運算,請確保兩個運算數都是數字。
⑤ / 運算符可能會產生一個非整數的結果,即使兩個運算數都是整數。
⑥ 如果第一個運算數為假,那么&&產生它的第一個運算數的值,否則產生第二個運算數的值。
⑦ 如果第一個運算數為真,那么||產生第一個運算數的值,否則產生第二個運算數的值。
⑧ 函數調用引發函數的執行。函數調用運算符是跟隨在函數名后面的一對圓括號。圓括號中可能包含傳遞給這個函數的參數。
⑨ 一個屬性存取表達式用於指定一個對象或數組的屬性或元素。
(5) 字面量
① 對象字面量是一種可以方便地按指定規格創建新對象的表示法。屬性的名字可以標識符或者字符串。這些名字當做字面量名,所以對象的屬性名在編譯時才能知道。屬性的值就是表達式。
② 數組字面量是一種可以方便按指定規格創建數組的表示法。
(6) 函數
函數字面量定義了函數值。它可以有一個可選的名字,用於遞歸地調用自己。它可以指定一個參數列表,這些參數就像變量一樣,在調用時由傳遞的實際參數初始化。函數的主體包括變量定義和語句。