1. 條件控制
    1. if
      1. if
        1. if (condition) statement
          1. if (true/false test) Do something;
      2. if/else
        1. if (condition) statement else //false statement
        2. if (condition) statement else if (condition) statement else statement
          1. 可產生無限個if/else if
      3. ?:
        1. 條件運算子
          1. 可用來指定變數的值,如同if/else
          2. 在變數值需要二選一時非常實用
        2. $Var = (condition)? "Value1" : "Value2";
        3. Hours = (inputHour>=12)? "PM" : "AM";
          1. //原if/else程式碼 if (inputHour >=12) Hours = "PM"; else Hours = "AM";
          2. ()內為條件,true指定?後的內容給變數,false指定:後的內容給變數
      4. (condition)最終的結果只能為true或false
    2. switch
      1. switch (expression) { case value: statement break; case value: statement break; ... default: statement }
      2. (expression)相當於資料,case等於「==」邏輯運算子,value等於要比較的值, 用說的:(expression)資料 == value嗎?是就執行break前的程式區塊(一段一段case比較), 如果都不是請執行default程式碼
  2. 迴圈控制
    1. for
      1. 適合重複動作已知次數
      2. 組成
        1. 初始化(initialization)
        2. 條件句(test condition)
        3. 動作(action)
        4. 更新(update)
      3. for ([1]initialization; [2]condition; [4]post loop expression) [3]statement //執行順序為[1][2][3][4]-[2][3][4]-[2][3][4]-...
        1. 最佳化for迴圈
          1. for (var i = 0; i < a.length; i++) {a[i]},這樣不是很有效率,因為每迴圈一次就會查詢一次 length 屬性。(但所有JavaScript的教科書都這樣教!)
          2. 比較好的寫法:for (var i = 0, len = a.length; i < len; i++) {a[i]},初始化時宣告兩個變數,把length屬性值存放到變數中。
          3. 更棒的寫法:for (var i = 0, item; item = a[i]; i++) {處理item},for 迴圈中間指定變數值的部分會被測試是否為「真的」(truthy):如果成功了,迴圈便會繼續。 由於 i 每次都會加一,陣列內的每個項目會被照順序指定到變數 item。當偵測到「假的」(falsy) 項目時(如 undefined)迴圈便會停止。 注意:這個小技巧只該用在你確定不會含有「假的」值的陣列(比如說一陣列的物件或 DOM 節點)。 假如你在可能含有 0 的數字資料或可能含有空字串的字串資料上做迴圈,最好還是用 i, j 的方式。
    2. while
      1. while迴圈本身沒有更新條件程式,必須自建條件更新程式(update)
      2. while (condition) statement
        1. 組成
          1. 檢測條件(test condition)
          2. 行動(action)
      3. do statement while (condition)
        1. 先執行一次完整程式碼,再進行檢測條件
    3. for...in
      1. 通常用來列舉物件的屬性
      2. for (property in expression) statement
    4. for/while
      1. while迴圈能做到任何for迴圈的任務,反之亦然
      2. for (init; test; update){ action; }
        1. init; while (test) { action; update; }
  3. with
    1. fon...in主要顯示物件的所有屬性,with敘述能夠針對物件建立一個程式區塊
    2. with (ObjectName){ ... }
      1. var Card = new Object(); with (Card){ //"新增"property name = "Bruce"; age = 33; birthday = new Date("2010/3/23"); document.write("姓名:"+name+",年齡:"+age+",生日:"+birthday); }
  4. break與continue關鍵字
    1. break; 終止此迴圈的執行,離開此迴圈
    2. continue; 終此這一次的迴圈的執行,執行下一輪的迴圈; 或停止continue之後所有迴圈程式,回到迴圈開頭(for/while/do)
  5. 函數
    1. 組成
      1. function name(){ statement }
        1. (arguments),括號內可有一或多個參數
        2. 當資料做為參數而傳入函式,它的行動就像函式內已初始化的區域參數; 雖然函式參數的行為很像函式內的區域變數,在函式內改變參數,卻不會影響函式外的任何事物
    2. 函式回傳資料
      1. 使用return關鍵字來回傳資料
        1. return value;
      2. 函式只要碰到return後立刻結束
        1. 技巧:在流程控制上,我們也可以使用沒有回傳值的return來結束函式
        2. return;
      3. 所以函式的回傳值會取代了函式的呼叫
        1. //假設有一計算價錢的函式cale(), //參數number傳入數量,會得到金額 totalPrice = cale(number); //cale()函式計算後會return price; //最後會以回傳值取代函式的呼叫 //可以看成:totalPrice = price; //來得到最終的結果
      4. return不只回傳資料,也負責結束函式
    3. function is data
      1. 函式實字(function literal)
        1. 當函式本體單獨出現,沒有名稱
      2. 把函式本體看成值,把函式名稱看為變數名稱
        1. var showMsg = function(Msg){ alert(Msg); }
        2. showMsg
          1. 函式名稱(函式參考),即變數名稱
        3. function(){...}
          1. 把function(函式實字)當成變數值
      3. 函式實字讓函式能像變數般操縱
        1. var myMessage = showMsg;
        2. 指派showMsg()函式給變數myMessage
        3. 以上程式碼表示函式也能利用變數語法而建立,甚至組成元件也相同
        4. 指派函式名稱給另一個變數,就是為了讓變數可以取用函式本體
          1. alert(myMessage("Hello World!"));
      4. function reference
        1. 呼叫showMsg()與myMessage的結果相同,因為兩個函式最後都參考(reference)了相同的原始碼, 因此函式名稱也稱函式參考(function reference)
        2. function(){...}
          1. showMsg
          2. myMessage
        3. 函式其實只是「值」參考到函式本體的變數
      5. 「函式參考」與「函式呼叫」
        1. 函式參考只會單獨出現
          1. var myMessage = showMsg;
          2. 對myMessage指派函式參考
        2. 函式呼叫則必定後隨括號( ),很多時候還附有參數
          1. myMessage("Hello World!")
          2. 呼叫myMessage()與showMsg()相同
      6. 參考重要性
        1. 函式參考不像一般變數,變數的資料儲存成記憶體的某個區段,函式則儲存對原始碼的參考, 函式變數的值不是原始碼本身,而是指向儲存原始碼的記憶體位置的指標, 函式使用參考,而非實際的值,比起儲存多份函式碼的複本,參考有效率多了
    4. 回呼函式
      1. callback function
        1. 沒有直接操作,也能呼叫函式; 回呼函式被瀏覽器呼叫,以回應發生在JavaScript外的事情
        2. 最常使用在處理事件
          1. <body onload="init();">
          2. 把init()函式連接上onload事件
          3. <input type="button" id="birthday" onclick="checkFormat("YYYY/MM/DD");" />
          4. 把checkFormat()函式連接上onclick事件
          5. 但這不合乎JavaScript與HTML「分離」原則
      2. 使用回呼函式連接事件
        1. window.onload=init;
          1. onload事件是window物件的屬性
          2. init函式名稱後面沒有括號,此時並非執行函式,只是想參考函式
          3. 白話:把init函式的參考指派給window物件的onload事件
        2. 函式參考沒有提供透過參數傳遞資料的方式, 我們可以使用「函式實字(function literal)」做為函式參考, 而後從函式實字內呼叫函式
          1. document.getElementById("birthday").onclick = function(evt){ checkFormat("YYYY/MM/DD"); }
          2. function(evt){...}
          3. 函式實字被指派給onclick事件,做為函式參考
          4. 函式實字包著對函式的呼叫,所以你可以把函式實字想成處理事件的無名函式, 因此函式實字又稱「匿名函式」(anonymous function)
          5. 透過evt,可以傳入事件處理器的事件物件(event object), 事件物件包含各個事件特有的資訊。
        3. 函式實字建立匿名事件處理函式
    5. 自訂函數
      1. function fnName([arg0, arg1, ...]){ statements [return [expression]]; }
        1. arguments物件
          1. 就算自訂函數沒有定義傳入的參數, arguments物件可以取得傳入的參數值, arguments[0]即可取得第一個參數的參考
        2. ECMAScript不會驗證傳遞給函數的參數個數是否等於函數定義的參數個數, 任何自訂的函數都可以接受任意個數的參數,而不會引發錯誤。 任何遺漏的參數都會以undefined的型式傳遞給函數,而多餘的參數將會被自動忽略。
    6. 內建函數
      1. 編碼轉換函數
        1. escape(String)/unescape(String)
          1. 不建議使用
          2. 將字串進行URL編碼
          3. 英文字母和數字
          4. 不進行編碼
          5. 空白與標點符號
          6. 轉換成%XX字串,XX為16進位值,例如「空白」為%20
          7. 中文字
          8. 轉換成%uXXXX,XXXX為16進位值,例如「網」為%u7DB2
        2. encodeURI()/decodeURI()
          1. 複雜度比escape()還高,將字串加密成URI字串
        3. encodeURIComponent()/decodeURIComponent()
          1. 複雜度比encodeURI()還高, 將字串加密成URI字串,連符號字元都會轉換
        4. URI
          1. Universal Resource Index
          2. Internet資源的標準格式,將所有非英文字母的字元轉換成%XY格式, XY為字元的ASCII碼,使用ISO Latin-1字元集
    7. 傳值或傳址
      1. Value/Address
        1. Value
          1. 只是將變數的值傳入函數,函數會另外配置記憶體儲存參數值,所以不會變更原變數的值
        2. Address
          1. 將變數實際儲存的記憶體位置傳入,所以如果在函數中變更參數值,會同時變動原變數值
      2. 預設傳遞
        1. 數字、字串、布林
          1. Value
          2. 參數傳遞和比較都是使用傳值方式
        2. 物件、陣列、函數
          1. Address
          2. 參數傳遞和比較都是使用傳址方式
        3. 字串物件
          1. Address
          2. 參數傳遞和比較都是使用傳址方式
    8. 變數範圍
      1. 區域變數(Local Variables)
        1. 在函數內宣告的變數,只能在函數內的程式區塊使用
      2. 全域變數(Global Variables)
        1. 變數在函數外宣告,整個JavaScript程式的函數和程式碼都可以存取
    9. 使用時機
      1. 複製原始碼是個好徵兆
      2. 某段原始碼逐漸變得笨重龐大,可以把它切成數個邏輯片段