var name_1[=value_1][,...,name_n[=value_n]
function fn(arg1,[,arg2[,...,[argn]]]){ ... }
function fn_1(arg){...}
var fn_2 = function (arg){...}
兩者的差異與hoisting有關,當使用(#1)的方式hoisting會將整個functio拉到最頂端。當使用(#2)僅定義的部分會被拉升到頂端,也就是var fn_2 拉到頂端,function還是留在原位。表示(#1)的分式可以在function定義之前就使用它(hoisted後就會在最上面)。
if (expression) {
statement
}
if (expression){
...
}else{
...
}
if (expression){
...
}else if(expression){
...
}else{
...
}
switch(n){
case 1:
...
break;
case 2:
...
break;
case 3:
...
break;
default:
...
break;
}
// 根據型別轉字串
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(expression)
...
which(true)
會是無窮迴圈。大部分的寫法會是以下例子
which(c< 10){
...
c++;
}
do{
...
}which(expression)
for(initialize; test ; increment){
...
}
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())就無法列舉。
主要與switch或迴圈函數一起使用。
function fn(obj){
if(!obj) return; // 當obj是null or undefined則跳回呼叫者,且回傳為undefined
...
}
break vs return
兩者都可以跳出迴圈,但兩者差異在於
break: 跳出迴圈,但會繼續執行迴圈外的程式。
return: 跳出迴圈,回到呼叫者。若迴圈外還有程式將不會執行。
當有exception時,throw 警示的錯誤或例外處理。
function fn(obj){
if(!obj) return throw new Error("obj error");
...
}
例外處理機制。
try{
// 程式本體
// 若無任何error,基本上會執行到完。
// 若出現throw error,會間接觸發catch。
}catch(e){
// 例外處理
// 當在try區間有發生throw error時,才會被觸發。
}finally{
// 此區間一定都會被執行,
}
若在try區間有return、break、continue跳離區塊,那直譯器會在跳離前執行finially區塊。
指出接在後面的程式碼屬於嚴謹程式碼(strict code)。
var hasStrictMode = (function() {"use strict"; return this === undefined}());