JS function的参数问题
类似方法重载
- 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的参数问题的更多相关文章
- 给js function的参数设置默认值
C# 中 function func(a,b=1){//具体方法} js 中 function func(a,b){ a= arguments[0] || 10; b= arguments[1] || ...
- 【转】javascript浏览器参数的操作,js获取浏览器参数
原文地址:http://www.haorooms.com/post/js_url_canshu html5修改浏览器地址:http://www.cnblogs.com/JiangXiaoTian/ar ...
- js 读取 地址栏参数 转
用JS获取地址栏参数的方法(超级简单) 方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) { var re ...
- Js替换地址栏参数
开了博客竟然有9个月没在来写过了.真是惭愧.今天需要用到一个用js替换地址栏参数的的功能.就自己用JS自己写了一个简单的函数.贴出来仅供大家参考.代码都写了注释.如下: /* js替换URL参数值,无 ...
- js获取url参数的方法
js获取url参数的方法有很多. 1.正则分析 function getQueryString(name) { var reg = new RegExp("(^|&)" + ...
- JS 不定函数参数argument的用法
本篇文章只要是对js的隐含参数(arguments,callee,caller)使用方法进行了介绍. arguments arguments 该对象代表正在执行的函数和调用它的函数的参数. [func ...
- 【功能代码】---4用JS获取地址栏参数方法
用JS获取地址栏参数方法 // 方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) { var reg = new Reg ...
- get方法与post方法的区别与js获取url参数的方式
1.get方法与post方法的区别: 区别一:get重点在从服务器上获取资源,post重点在向服务器发送数据:区别二:get传输数据是通过URL请求,以field(字段)= value的形式,置于UR ...
- (转)用JS获取地址栏参数的方法(超级简单)
转自http://www.cnblogs.com/fishtreeyu/archive/2011/02/27/1966178.html 用JS获取地址栏参数的方法(超级简单) 方法一:采用正则表达式获 ...
随机推荐
- IOC原理解释
spring ioc它其实是一种降低对象耦合关系的设计思想,通常来说,我们在一个类调用另一个类的方法的时候,需要不断的new新的对象来调用该方法,类与类之间耦合度比较高,有了ioc容器以后,ico容器 ...
- spring3 + mybatis + maven:junit测试错误
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component c ...
- coco2dx实现翻拍效果
昨天吃饭看见同事演示他做的翻牌效果,感觉不错,我心血来潮也来搞个,很简单直接上代码. class FlipCard : public CCNode { public: CREATE_FUNC(Flip ...
- (转)SQL Server 的事务和锁(二)-Range S-S锁
在这篇随笔中,我们的主要关注点在 Key-Range Lock.Key-Range Lock有 S-S.S-U.I-N.X-X几种情况.我们一个一个来说,力求明白.遗憾的是,这里可能会比较冗长,那么死 ...
- svn Error: post-commit hook failed (exit code 127) with output
Command: Commit Modified: C:\Users\xsdff\Desktop\project\index.html Sending content: C:\Users\xsdff\ ...
- 菜鸟学Linux命令:bg fg jobs命令 任务管理
jobs命令 jobs命令用于查看当前终端后台运行的任务 注意和ps的区别: ps命令用于查看瞬间进程的动态 通过一个实例可以理解它们之间的区别,依次执行如下命令:vim & //后台执行vi ...
- vs2010如何生成EXE文件如何更改EXE程序图标
vs2010如何生成EXE文件 F5启动调试后,进入下面路径查找: 我的文档\Visual Studio 2010\Projects\项目名称\项目名称\bin\Debug 如何更改EXE程序图标 其 ...
- cookie 暂时保存内容与恢复
<script type="text/javascript"> $(function(){ $('.ycb_anniu').click(function(){ $.co ...
- Android横屏竖屏切换的问题
Android横屏竖屏切换的问题 http://blog.sina.com.cn/s/blog_77c632410101790w.html
- IE下Checkbox标签的onchange事件兼容
Checkbox onchange事件在谷歌上ok,在ie8上不起作用了. 一番周折,测试发现勾选了以后还要点击其他位置才会触发onchange事件. 用度娘查询了一下. 有下面两种解决方式: 用on ...