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类型的参数才能调用!");
    }
}

JS function的参数问题的更多相关文章

  1. 给js function的参数设置默认值

    C# 中 function func(a,b=1){//具体方法} js 中 function func(a,b){ a= arguments[0] || 10; b= arguments[1] || ...

  2. 【转】javascript浏览器参数的操作,js获取浏览器参数

    原文地址:http://www.haorooms.com/post/js_url_canshu html5修改浏览器地址:http://www.cnblogs.com/JiangXiaoTian/ar ...

  3. js 读取 地址栏参数 转

    用JS获取地址栏参数的方法(超级简单) 方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!)   function GetQueryString(name) {      var re ...

  4. Js替换地址栏参数

    开了博客竟然有9个月没在来写过了.真是惭愧.今天需要用到一个用js替换地址栏参数的的功能.就自己用JS自己写了一个简单的函数.贴出来仅供大家参考.代码都写了注释.如下: /* js替换URL参数值,无 ...

  5. js获取url参数的方法

    js获取url参数的方法有很多. 1.正则分析 function getQueryString(name) { var reg = new RegExp("(^|&)" + ...

  6. JS 不定函数参数argument的用法

    本篇文章只要是对js的隐含参数(arguments,callee,caller)使用方法进行了介绍. arguments arguments 该对象代表正在执行的函数和调用它的函数的参数. [func ...

  7. 【功能代码】---4用JS获取地址栏参数方法

    用JS获取地址栏参数方法 // 方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) { var reg = new Reg ...

  8. get方法与post方法的区别与js获取url参数的方式

    1.get方法与post方法的区别: 区别一:get重点在从服务器上获取资源,post重点在向服务器发送数据:区别二:get传输数据是通过URL请求,以field(字段)= value的形式,置于UR ...

  9. (转)用JS获取地址栏参数的方法(超级简单)

    转自http://www.cnblogs.com/fishtreeyu/archive/2011/02/27/1966178.html 用JS获取地址栏参数的方法(超级简单) 方法一:采用正则表达式获 ...

随机推荐

  1. Linux 之 最常用的20条命令

    玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了.当然你也可以在使用时去找一下 ...

  2. malloc/free vs new/delete

    malloc/new是库函数. new/delete是运算符. 对于非内部数据类型的对象而言,光用malloc/free 无法满足动态对象的要求.对象在创建的同时要自动执行构造函数, 对象在消亡之前要 ...

  3. linux 多个文件中查找字符串

    2015年2月9日 14:36:38 # find <directory> -type f -name "*.c" | xargs grep "<str ...

  4. VMware安装64位操作系统提示Intel VT-x处于禁用状态的解决办法

    用VMware安装64位操作系统时,如果目前本地的操作系统是64位的,那么可以说明CPU是肯定支持64位的,这时候如果提示此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态.这个 ...

  5. Fastreport使用经验(转)在Delphi程序中访问报表对象

    Fastreport使用经验(转) 在Delphi程序中访问报表对象 最基本的方法就是frxReport1.FindObject. 然后把返回的对象强制转换成它的类型,当然,在报表中必须真的有这么个东 ...

  6. PA

    [题目描述] 汉诺塔升级了:现在我们有?个圆盘和?个柱子,每个圆盘大小都不一样, 大的圆盘不能放在小的圆盘上面,?个柱子从左到右排成一排.每次你可以将一 个柱子上的最上面的圆盘移动到右边或者左边的柱子 ...

  7. Struts2中的ActionContext、OGNL及EL的使用

    文章分类:Java编程 本文基于struts2.1.8.1,xwork2.1.6 1.EL         EL(Expression Language)源于jsp页面标签jstl,后来被jsp2.0 ...

  8. [转]Java Thread Dump 性能分析

    Java and Thread 一个 web 服务器使用几十到几百个线程来处理大量并发用户,如果一个或多个线程使用相同的资源,线程之间的竞争就不可避免了,并且有时候可能会发生死锁. Thread co ...

  9. Source Insight 多标签插件

    Source Insight不仅仅是一个强大的程序编辑器,它还能显示reference trees,class inheritance diagrams和call trees.Source Insig ...

  10. Inno setup 简单打包教程

    转自:http://blog.csdn.net/ruifangcui7758/article/details/6662646 前段时间关注了VC6.0自带的Installshield打包的使用方法,感 ...