开发者社区> zhanginzaghi> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

JS编程建议——58:灵活使用Arguments

简介: 58:灵活使用Arguments
+关注继续查看

建议58:灵活使用Arguments
JavaScript函数的参数是不固定的,调用函数时传递给它的实参也很随意,为了有效管理参数,JavaScript支持Arguments机制。
Arguments是一个伪数组,可以通过数组下标的形式获取该集合中传递给函数的参数值。例如,在下面这个函数中,没有指定形参,但在函数体内通过Arguments对象可以获取传递给该函数的每个实参值。
function f(){

for(var i = 0; i < arguments.length; i ++ ){
    alert(arguments[i]);
}

}
f(3, 3, 6);
Arguments对象仅能够在函数体内使用,它仅作为函数体的一个私有成员而存在,因此可以通过点号运算符来指定Arguments对象所属的函数。由于Arguments对象在函数体内是唯一的和可指向的,因此一般会省略前置路径,直接引用Arguments对象的调用标识符arguments。
通过数组的形式来引用Arguments对象包含的实参值,如arguments[i],其中arguments表示对Arguments对象的实际引用,变量i是Arguments对象集合的下标值,从0开始,直到arguments.length(其中length是Arguments对象的一个属性,表示Arguments对象包含的实参的个数)。
由于Arguments不是Array的实例,因此不能够直接调用数组的方法,但通过call或apply方法能够间接实现调用数组的部分方法。
Arguments对象中的每个元素实际上就是一个变量,这些变量用来存储调用函数时传递的实参值。通过arguments[]数组和已经命名的形参可以引用这些变量的值。使用Arguments对象可以随时改变实参的值。例如,在下面这个示例中把循环变量的值传递给Arguments对象元素,以实现动态改变实参的值。
function f(){

for(var i = 0; i < arguments.length; i ++ ){
    arguments[i] =i;
    alert(arguments[i]);

}
}
f(3, 3, 6); //提示1、2、3,而不是3、3、6
通过修改Arguments对象的length属性值,可以达到改变函数实参个数的目的。当length属性值增大时,增加的实参值为undefined,当length属性值减小时,则会丢弃arguments数据集合后面对应个数的元素。
Arguments在实际开发中具有重要的价值,使用它可以监测用户在调用函数时所传递的参数是否符合要求,增强函数的容错能力,同时还可以开发出很多功能强大的函数。
如果要定义的函数参数个数不确定,或者参数个数很多,又不想为每个参数都定义一个变量,此时定义函数可以保留参数列表为空,在函数内部使用Arguments对象来访问调用函数时传递的所有参数。下面这个示例就是利用Arguments对象来计算函数任意多个参数的平均值。
function avg(){

var num = 0, l = 0;
for(var i = 0; i < arguments.length; i ++ ){
    if(typeof arguments[i] != "number")
        continue;
    num += arguments[i];
    l ++ ;
}
num /= l;
return num;

}
alert(avg(1, 2, 3, 4)); //2.5
alert(avg(1, 2, "3", 4)); //2.3333333333333335
表单验证是页面设计中经常要完成的任务,下面的示例验证所输入的值是否符合邮箱地址格式。
function isEmail(){

if(arguments.length>1) throw new Error("只能够传递一个参数");
var regexp = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+

((.|-)[A-Za-z0-9]+)*.[A-Za-z0-9]+$/;

if (arguments[0].search(regexp)!= -1)
    return true;
else
    return false;

}
var email = "abc@163.com";
alert(isEmail(email)); //true
Arguments对象包含一个callee属性,它能够返回当前Arguments对象所属的函数引用,这相当于在函数体内调用函数自身。在匿名函数中,callee属性比较有用,通过它在函数内部引用函数自身。
在下面这个示例中,通过arguments.callee获取对当前匿名函数的引用,然后通过函数的length属性确定它的形参个数。最后,通过实参和形参数目的比较来确定传递的参数是否合法。
function f(x, y, z){

var a = arguments.length;
var b = arguments.callee.length;
if (a != b){
    throw new Error("传递的参数不匹配");
}
else{
    return x + y + z;
}

}
alert(f(3, 4, 5)); //值为12
Function对象的length属性返回的是函数的形参个数,而Arguments对象的length属性返回的是函数的实参个数。如果函数不是匿名函数,则arguments.callee等价于函数名。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
javascript挑战编程技能-第三题:计算矩形房间面积
javascript挑战编程技能-第三题:计算矩形房间面积
39 0
javascript挑战编程技能-第四题:谈个if讲点逻辑
javascript挑战编程技能-第四题:谈个if讲点逻辑
28 0
javascript挑战编程技能-第八题:99乘法表
javascript挑战编程技能-第八题:99乘法表
37 0
javascript挑战编程技能-第一题:将问题转变成代码
javascript挑战编程技能-第一题:将问题转变成代码
33 0
javascript挑战编程技能-第六题:检查密码强度
javascript挑战编程技能-第六题:检查密码强度
61 0
javascript挑战编程技能-第九题:数据结构
javascript挑战编程技能-第九题:数据结构
14 0
javascript挑战编程技能-第五题:函数作为javascript的一等公民
javascript挑战编程技能-第五题:函数作为javascript的一等公民
33 0
JavaScript深入之call和apply的模拟实现
JavaScript深入系列第十篇,通过call和apply的模拟实现,带你揭开call和apply改变this的真相
47 0
JavaScript深入之bind的模拟实现
JavaScript深入系列第十一篇,通过bind函数的模拟实现,带大家真正了解bind的特性
44 0
多叉树结合JavaScript树形组件实现无限级树形结构(一种构建多级有序树形结构JSON(或XML)数据源的方法)
如何将数据库中的层次数据转换成对应的层次结构的JSON或XML格式的字符串,返回给客户端的JavaScript树形组件?这就是我们要解决的关键技术问题。
253 0
+关注
zhanginzaghi
IT菜鸟
文章
问答
文章排行榜
最热
最新
相关电子书
更多
编程语言如何演化—— 以 JS 的 private 为例
立即下载
JS 语言在引擎级别的执行过程
立即下载
Python第五讲——关于爬虫如何做js逆向的思路
立即下载