在物件導向的程式設計中,很多語言都支援函數重載,能根據函數傳遞的不同個數、類型的參數來做不同的操作,JS對它卻不支持,需要我們額外做些小動作。
在JS的函數執行上下文中有一個名為arguments的有意思的變量,它以數組的形式存儲了函數執行時傳遞過來的所有參數,即使函數定義沒有定義這麼多個形參。還有一個特別之處就是跟Array類型相比,arguments變數有且只有一個length屬性,Array的方法,例如push、pop 等,它並不具備,它只是一個「偽數組」:具有length屬性,存儲的數組能夠用數組訪問符[]來訪問,並且是只讀不可寫。
一、對於不同個數參數的重載
這裡應該很明白,直接用arguments函數的length屬性來判斷就可以了。
二、對於不同類型的參數的重載
對於JS這樣一種動態類型的語言,這種變數聲明的隨意性淡化了嚴格的變數類型在開發人員腦子裡的重要性(PS:同樣是基於ECMA系統的,AS就引入了變數宣告的強制類型),許多意想不到的BUG其實都是由這種變數類型的自動轉換造成的。其實JS提供了很精確的方法讓我們來嚴格偵測變數的類型,比較通 用的就是typeof方法和constructor屬性。
1、typeof variable 回傳變數型別
複製程式碼
temp = "say"; //string
temp = "say"; //string
temp = "say"; //string
temp = "say"; //string
temp = 1; //number
temp = undefined; //undefined
temp = null; //object temp = {}; //object
temp = []; //object
temp = true; //boolean
temp = function (){} //function
alert(typeof temp);
複製程式碼
程式碼如下:
temp = "say"; ==String; //true temp= {};
temp.constructor == Object;//true
temp= [];
temp.constructor == Array;//true
複製程式碼
程式碼如下:
//自訂物件function Ball() {}
//實例化一個物件
var basketBall = new Ball();
basketBall.constructor==Ball; //true
複製程式碼 程式碼如下:
function talk(msg){
var t = typeof msg;
if(t=="string"){ else if(t=="number"){
alert("It's a number");
talk("demo"); //It's a number
附上一個很巧妙的嚴格偵測參數型別和個數的函數:
複製程式碼
throw "Invalid number of arguments. Expected " types.length ", received " arg 🎜> for ( var i = 0; i //如JavaScript某些類型不符,則拋出異常
//如JavaScript某些類型不符[i] ) {
> }
}
//上述方法的使用
function doFunction(id,name){
//偵測參數數量與型別
strict([Number,String],arguments); strict([Number,String],arguments); strict([Number,String],arguments);
}