iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 5
0

宣告述句

var

var name_1[=value_1][,...,name_n[=value_n]

  • var宣告的特性是無法被刪除的。
  • 如果是寫在function,則作用的scope會在該function內。
  • 如果寫在程式碼最頂端,則屬於全域scope。
  • 當變數被隨處定義時,宣告會被提昇(hoisted)到程式最頂端或function的頂端。

function

function fn(arg1,[,arg2[,...,[argn]]]){ ... }

function宣告述句與function定義運算式
  • function宣告述句(#1)
    function fn_1(arg){...}
  • function定義運算式(#2)
    var fn_2 = function (arg){...}

兩者的差異與hoisting有關,當使用(#1)的方式hoisting會將整個functio拉到最頂端。當使用(#2)僅定義的部分會被拉升到頂端,也就是var fn_2 拉到頂端,function還是留在原位。表示(#1)的分式可以在function定義之前就使用它(hoisted後就會在最上面)。

條件述句(conditional statements)

if / else
if (expression) {
    statement
}

if (expression){
    ...
}else{
    ...
}

if (expression){
    ...
}else if(expression){
    ...
}else{
    ...
}
switch
switch(n){
    case 1:
            ...
        break;
    case 2:
            ...
        break;
    case 3:
            ...
        break;
    default:
            ...
        break;
}
  • 當遇到 n 遇到哪個case就會進入執行
  • break跟return都會跳出switch
// 根據型別轉字串
function fn (x){
    switch(typeof x){
        case "number":
            return x.toString(16);
        case "string":
            return x;
        default:
            return String(x);;
    }
}

break : 執行時,會直接跳到switch尾端,等同於跳出switch。
如果未加break,則敘述句會一直往下判斷。
case 的匹配是透過===,非==。

迴圈

which
which(expression)
    ...
  • 先確認expression為truthy,才會進入執行。
  • which(true) 會是無窮迴圈。

大部分的寫法會是以下例子

which(c< 10){
    ...
    c++;
}
do/which
do{
    ...
}which(expression)
  • 至少會執行一次,然後在which做判斷是否要再進入迴圈。
for
for(initialize; test ; increment){
    ...
}
for / in
for(variable in object){
    ...
}

使用正規的for迴圈

for(var i =0 ; i<a.length;i++){
    console.log(a[i])
}

上面的例子當然也可以用for / in 實作

for(var p in obj){
    console.log(obj[p])
}

JavaScript直譯器會先估算obj,如果為null or undefined,則不會進入迴圈。
如果是基型值(primitive value),則會轉為wrapper物件。若不是以上兩個狀態應該就是物件了。
直譯器會對物件每個可列舉(enumerable)的特性都執行過一次。

實際上,並非物件裡的都是可列舉,如果是JavaScript所定義的內建方法(toString())就無法列舉。

跳躍句

break

主要與switch或迴圈函數一起使用。

return
  • 主要放置於function裡,用來回覆呼叫的變數。
  • 若在function內無return,當在執行完function,回到呼叫者本身會是undefined。
  • 若return後未接任何expression或value,則會還傳unedfined。
function fn(obj){
    if(!obj) return; // 當obj是null or undefined則跳回呼叫者,且回傳為undefined
    ...
}

break vs return
兩者都可以跳出迴圈,但兩者差異在於
break: 跳出迴圈,但會繼續執行迴圈外的程式。
return: 跳出迴圈,回到呼叫者。若迴圈外還有程式將不會執行。

continue
  • 只能在迴圈使用(which、for、...)
  • 在迴圈內當執行到continue,會略過接下來要執行程式,直接進入下一次的迴圈。
throw

當有exception時,throw 警示的錯誤或例外處理。

function fn(obj){
    if(!obj) return throw new Error("obj error");
    ...
}
try / cache / finally

例外處理機制。

try{
    // 程式本體
    // 若無任何error,基本上會執行到完。
    // 若出現throw error,會間接觸發catch。
}catch(e){
    // 例外處理
    // 當在try區間有發生throw error時,才會被觸發。
}finally{
    // 此區間一定都會被執行,
}

若在try區間有return、break、continue跳離區塊,那直譯器會在跳離前執行finially區塊。

use strict

指出接在後面的程式碼屬於嚴謹程式碼(strict code)。

  • strict與非strict差異
    • 不允許使用with。
    • 所有參數都必須宣告。若將值指派給一個非宣告變數,則會產生ReferenceError。
    • 在strict mode下,當函式調用函式(立即函數),其this為undefined。
    • 在非strict mode下,當函式調用函式(立即函數),其this一定是全域變數。
      可利用判斷是否為strict mode
var hasStrictMode = (function() {"use strict"; return this === undefined}());

上一篇
Day 4: 運算式與運算值
下一篇
Day 6: 物件 Object
系列文
Javascript 犀牛本-濃縮再濃縮 提煉再提煉30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言