JS function的參數問題

來源:互聯網
上載者:User

標籤:style   blog   color   io   for   ar   問題   cti   

1.當傳入的參數個數小於聲明的參數個數時,缺少的參數值就是:undefined

   類似方法重載

var f1 = function(p1,p2,p3){
    switch(arguments.length){
        case 0:
            alert("無參版本的f1")
            break;
        case 1:
            alert("1個參數版本的f1:" + p1)
            break;
        case 2:
            alert("2個參數版本的f1:" + p1 + "," + p2)
            break;
        case 3:
            alert("3個參數版本的f1:" + p1 + "," + p2 +  "," + p3)
            break;
        default:
            alert("不支援多於3個參數的調用!");
            break;
    }
}
 
f1();
f1("1");
f1("a",100);
f1("1","2","3");
f1("1","2","3","4")

 

2.函數中可以通過arguments對象來擷取函數的全部參數,也就是說可以用arguments進行參數個數檢測

var fnMustOneParam = function(p){
                 
    //檢測有沒有參數傳入
    if (typeof p=="undefined"){
        alert("fnMustOneParam必須要有參數傳入,才能調用(1)!");
        return ;
    }
 
    //也可以寫成這樣
    if (arguments.length==0){
        alert("fnMustOneParam必須要有參數傳入,才能調用(2)!");
        return;
    }
 
    //檢測參數個數
    if (arguments.length!=0){
        alert("fnMustOneParam只能傳入一個參數調用!");
        return;
    }
 
    //to do...
 
}
 
function show()
{
    var largest=Max(10,20,30,1,10000,88,56,123);
     alert(largest);//display:10000
}
function Max(m)
{
   var re=0;
   for(var i=0;i<arguments.length;i++)
   {
      if(arguments[i]>re)
      {
         re=arguments[i];
       }
   }
return re;
}

Arguments對象是一個類似於數組的對象,可以按照參數的數目而不是名稱來擷取全部參數,並且arguments也具有length屬性,可以用來擷取擷取實際參數的個數.

arguments雖然具有一些數組的特性,但是他不是數組.實際上arguments[]是和實際參數是引用同一變數的兩種方法:

function ChangeParamValue()
{
   ChangParamValueDo("第一個參數","第二個參數");
}
function ChangParamValueDo(a,b)
{
    alert("改變前:a:"+a+",b:"+b);// display:改變前:a:第一個參數,b:第二個參數
   arguments[0]="arguments0";
    arguments[1]="arguments1";
   alert("用arguments改變後:a:"+a+",b:"+b); // display:用arguments改變後:a:arguments0,b:arguments0
}
arguments有一個callee屬性,用沒過來引用當前正在執行的函數
function f(x)
{
      if(x<=1) return x;
      return x*arguments.callee(x-1);
}

 

3。把對象屬性用作參數:這樣可以不必去記參數的順序,用對象的屬性名稱來傳參

function ArrayCopy(name,age,grade,sex,height,weiht)
{
   alert("name:"+name+" age:"+age+" grade:"+grade+" sex:"+sex+" height:"+height+" weiht:"+weiht);
}
function EasyCopy(args)
{
    ArrayCopy(args.name||"",
    args.age||0,
    args.grade||"one",
    args.sex||"可選",
    args.height||100,
   args.weight||100 )
}
function show()
{
    EasyCopy({name:‘lily‘,age:‘13‘,grade:‘three‘});
   EasyCopy({name:‘mark‘,height:‘180‘,weight:180}); 
}

 

4、js引擎同樣不會檢測參數的類型,如果您希望對參數的基本類型做些限制,可以利用typeof 來進行參數基本類型檢測

var fnString = function(s){
    if (arguments.length!=1){
        alert("參數個數不匹配!");
        return ;
    }
 
    if (typeof s != "string"){
        alert("只能傳入string類型的參數!");
        return ;
    }
     
}

 

 5、自訂類的參數類型檢測,如果是自訂類的參數,如果用typeof運算子號,只能得到object的類型檢測結果,這時可利用instanceof運算子號來解決

function Person(name,age){
    this.name = name;
    this.age = age;
}
 
function fnPerson(p){
    if (arguments.length==1 && p instanceof Person){
    //if (arguments.length==1 && p.constructor == Person) //也可以寫成這樣
        alert("fnPerson調用成功,p.name=" + p.name + ",p.age=" + p.age);
    }
    else{                  
        alert("必須傳入一個Person類型的參數才能調用!");
    }
}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.