標籤: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類型的參數才能調用!");
}
}