Arguments对象
调用对象定义了一个特殊的属性,名称arguments,它实际上引用了一个特殊对象Arguments对象,因为Arguments属性是调用对象的一个属性,因此它的状态和局部变量以及形参是相同的。arguments.length可以获取传递给参数的实参数量
废话不多少,例子说明一切
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> </HEAD> <BODY> <SCRIPT LANGUAGE="JavaScript"> <!-- function f(x,y,z) { if (f.length !=arguments.length) { //可以通过读取函数的length和arguments的length属性值来检查形式参数的数量是否相等 //因为前者恰好是形参的数量,而后者是实参数量 //如果不相等抛出异常 throw new Error('function f called with' +arguments.length+'arguments,but it expects'+f.length+'arguments'); } else { document.write("f("+[x,y,z]+')'+'<br/>'); } } try { f(1,2,3); f(2,4);//抛出异常,后面的将不再执行 f(4); f("a","b","c","d","e","f"); } catch (ex) { document.write(ex.message); } //--> </SCRIPT> </BODY> </HTML>
登录后复制
运行结果:
Java代码
f(1,2,3) function f called with2arguments,but it expects3arguments
登录后复制
arguments的行为有点想数组,但它其实并不是数组,它不具备JavaScript核心数组的一些方法如join、sort、slice等
一个使用arguments对象那个接收任意参数的例子
Java代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> </HEAD> <BODY> <SCRIPT LANGUAGE="JavaScript"> <!-- function f() {// 利用arguments来读取任意个数的参数 document.write("f(" +Array.apply(null,arguments) + ")" +"<br/>");//apply()应用某一对象的一个方法,用另一个对象替换当前对象。 } f(1,2,3); f("a","b"); f(true); //--> </SCRIPT> </BODY> </HTML>
登录后复制
一个使用arguments对象模拟函数重载的例子
Java代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE> </HEAD> <BODY> <SCRIPT LANGUAGE="JavaScript"> <!-- function Point() { if(arguments.length ==0)//如果没有参数 { //默认的xy属性都设置0 this.x=0; this.y=0; this.toString=function() { return this.x+" "+ this.y ; } } else if (arguments.length <2)//如果实参小于2 { var p=arguments[0]; if (p instanceof Point )//判断实参类型如果是Point,那么执行属性复制 { this.x =p.x; this.y =p.y this.toString=function() { return this.x+" "+ this.y ; } } else if ( typeof p=="number" || p instanceof Number)//如果是数值,那么这个值作为当前Point的x属性值,y属性默认0 { this.x=(Number)(p); this.y=0; this.toString=function() { return this.x+" "+ this.y ; } } else {//如果这个参数既不是Point又不是Number,抛出类型异常 throw new TypeError("参数类型错误!") } } else if (arguments.length==2) { var x= arguments[0]; var y= arguments[1]; //否则当参数数量为两个并且为number类型的时候,把她们分别作为Point的xy if ((typeof x=='number' || x instanceof 'Number') && typeof y == 'number' ||y instanceof 'Number') { this.x = x; this.y = y; this.toString=function() { return this.x+" "+ this.y ; } } else throw new TypeError('参数类型错误!'); } else { throw new TypeError("参数类型错误!"); } } function dwn(s) { document.write(s+"<br/>"); } dwn(new Point());//00 dwn(new Point(new Point()));//00 dwn(new Point(3));//30 dwn (new Point(4,5));//45 //--> </SCRIPT> </BODY> </HTML>
登录后复制
需要注意的是:在使用了命名参数的函数中,arguments中的参数也始终是相应命名参数的别名,不管这个参数是值类型还是引用类型,改变arguments中的参与一定会影响到对应的命名参数,反之亦然如:
Java代码
function f(x) { alert(x);//参数初始值 arguments[0]++;//改变参数的值 alert(x);//x的值发生了改变 }
登录后复制
Arguments对象还提供了一个有用的属性叫做callee,它被用来应用当前正在执行的函数,它提供了一种匿名的递归调用能力,这对于闭包说非常有用,如:
用闭包计算10的阶乘
Java代码
function(x){ return x>1?x*arguments.callee(x-1):1 }(10);
登录后复制
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章
刺客信条阴影:贝壳谜语解决方案
4 周前
By DDD
Windows 11 KB5054979中的新功能以及如何解决更新问题
3 周前
By DDD
在哪里可以找到原子中的起重机控制钥匙卡
4 周前
By DDD
<🎜>:死铁路 - 如何完成所有挑战
1 个月前
By DDD
Atomfall指南:项目位置,任务指南和技巧
1 个月前
By DDD

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)