`
lee3836
  • 浏览: 68271 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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>


运行结果:
f(1,2,3)
function f called with2arguments,but it expects3arguments 


arguments的行为有点想数组,但它其实并不是数组,它不具备JavaScript核心数组的一些方法如join、sort、slice等

一个使用arguments对象那个接收任意参数的例子
<!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对象模拟函数重载的例子
<!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中的参与一定会影响到对应的命名参数,反之亦然如:
function f(x)
{
   alert(x);//参数初始值
   arguments[0]++;//改变参数的值
   alert(x);//x的值发生了改变
}


Arguments对象还提供了一个有用的属性叫做callee,它被用来应用当前正在执行的函数,它提供了一种匿名的递归调用能力,这对于闭包说非常有用,如:
用闭包计算10的阶乘
function(x){
   return x>1?x*arguments.callee(x-1):1
}(10);
分享到:
评论

相关推荐

    arguments对象的使用

    4. **arguments对象与形参的关系**:如果函数定义了形参,那么形参变量会自动绑定到`arguments`对象中对应的值。例如,函数`function foo(a, b) { console.log(a, b); }`调用`foo(1, 2)`时,`a`和`b`将分别得到`...

    Arguments对象作用深度研究.pdf

    首先,Arguments对象是一个伪数组对象,这意味着它拥有一个length属性,并且可以通过索引(如arguments[0]、arguments[1]等)来访问各个参数值。然而,它并不完全符合数组的行为,不支持数组的一些内置方法,如push...

    Javascript学习笔记之函数篇(四):arguments 对象

    JavaScript中的arguments对象是一个特殊对象,它代表当前正在执行的函数的参数集合。这个对象可以在函数体内直接使用,无须提前声明参数名即可访问参数。每一个JavaScript函数作用域内都有一个名为arguments的局部...

    js arguments对象应用介绍

    在JavaScript中,所有的函数参数都会被自动存储在arguments对象中,它是一个类数组对象,允许我们在函数内部通过这个对象访问所有传递给函数的参数。 在正式开始之前,先简要回顾一下arguments对象的基本概念。...

    javascript内置对象arguments详解

    虽然arguments对象包含了传递给函数的所有参数,但它并不是一个真正的数组,这在使用时需要特别注意。 首先,我们来探讨arguments对象是什么。它提供了一种方式来访问函数调用时传递给函数的所有参数。这是...

    JS:arguments

    在JavaScript编程中,`arguments`对象是一个非常有用的特性,尤其是在处理函数调用时不确定参数数量的情况下。虽然它不是ECMAScript标准的一部分,但所有主流浏览器都支持这一特性,使其成为开发人员在设计灵活、可...

    Javascript中的arguments对象

    JavaScript中的arguments对象是一个非常有用的内置对象,它存在于所有函数体内,特别是当函数被调用时。它为函数提供了一种访问所有传递给函数的参数的方法。由于JavaScript本身不支持函数重载的机制,arguments对象...

    JavaScript的arguments对象应用示例

    JavaScript中的arguments对象是函数内预定义的一个类数组对象,它包含了传递给函数的所有参数值。尽管在现代JavaScript开发中,ES6引入了更灵活的参数处理方式,如rest参数和默认参数,但在学习和理解JavaScript时,...

    深入解析JavaScript中的arguments对象

    在JavaScript编程语言中,`arguments`对象是一个非常特殊且实用的特性,它允许开发者在函数内部访问所有传入的实际参数,而不仅仅限于函数声明时定义的参数。这个对象虽然不是真正的数组,但它具备了一些数组的特性...

    前端开源库-arguments-extended

    "arguments-extended"就是一个这样的开源库,专为处理JavaScript中的`arguments`对象提供了一系列实用方法,旨在增强参数操作的灵活性和便利性。 `arguments`对象在JavaScript中是一个特殊的对象,它在函数内部可用...

    Javascript中arguments对象详解

    在JavaScript编程中,arguments对象是一个非常有用的概念,尤其是在处理函数参数方面。在许多编程语言中,如PHP,函数参数可以设置默认值,这样当调用函数时,如果缺少参数,就会自动使用预设的默认值。但在...

    js中arguments对象的深入理解

    本文主要给大家介绍了关于js中arguments对象的相关内容,下面话不多说了,来一起看看详细的介绍吧 一、在函数调用的时候,浏览器每次都会传递进两个隐式参数 函数的上下文对象this 封装实参的对象arguments 二、...

    JavaScript中如何通过arguments对象实现对象的重载

    `arguments`对象是一个类数组对象,它包含了函数调用时传入的所有实际参数。无论函数定义了多少个形式参数(形参),`arguments`对象总是包含所有传递给该函数的实际参数。例如,以下是一个简单的函数: ```...

    JS函数动态传递参数的方法分析【基于arguments对象】

    js函数体内可以通过arguments对象来接收传递进来的参数,利用这一对象属性可以动态传参。 function box() { return arguments[0]+' | '+arguments[1]; //得到每次参数的值 } alert&#40;box(1,2,3,4,5,6&#41;); //...

    JS中使用变量保存arguments对象的方法

    在JavaScript中,`arguments`对象是一个特殊变量,它在每个函数内部都可用,用于访问函数的所有传入参数,无论这些参数是否已命名。这个对象是一个类数组对象,意味着它有一个`length`属性,但不支持数组的所有方法...

Global site tag (gtag.js) - Google Analytics