对javascript中的arguments对象的认识

arguments是指向实参对象的引用。它可以使用方括号语法访问它的每一个元素(即第一个元素是 arguments[0] ,第二个元素是 argumetns[1] ,以此类推),使用 length 属性来确定传递进来多少个参数,但是arguments 对象只是与数组类似,它并不是 Array 的实例。这样说可能好抽象。那么我们来看看简单的例子。

若定义了f函数,它只有一个参数时。而传入两个实参时,就需要用到arguments来获取参数。

function f(x){
  alert(x);//输出1
  alert(arguments[0]);//输出1
  alert(arguments[1]);//输出2
}
f(1,2);

当f方法的参数只有一个x时,那么第二个实参就需要通过arguments[1]来获得。同时,arguments包含有一个leng属性。若f方法传入两个参数时,arguments.length的值就是2。

arguments对象最适合的应用场景应该是这样的一类函数,这类函数包含了固定的已经命名的必须参数,以及后面可以传入个数不定的可选的实参。

arguments并不是真正的数组,它是一个实参对象。

function f(x){
alert(x);//输出1
arguments[0]=2;
alert(x);//输出2
}
f(1);

  这个例子可以明显的看出arguments并不是一个普通数组。若是普通数组的话第二个alert就不会输出2。在这个例子里,x和arguments[0]是指代同一个值的,修改其中一个就会影响到另一个。但是在严格的模式下这个arguments是不可以对其进行修改的。

arguments对象的长度是由实参个数而不是形参个数决定的。形参是函数内部重新开辟内存空间存储的变量,但是其与arguments对象内存空间并不重叠。对于arguments和值都存在的情况下,两者值是同步的,但是针对其中一个无值的情况下,对于此无值的情形值不会得以同步。

function f(a, b, c){
      alert(arguments.length);   // 输出: "2"
      a = 100;
      alert(arguments[0]);       // 输出: "100"
      arguments[0] = "qqyumidi";
      alert(a);                  // 输出: "qqyumidi"
      alert(c);                  // 输出: "undefined"
      c = 2012;
      alert(arguments[2]);       // 输出: "undefined"
 }

 f(1, 2);

  通过length,实现重载。通过判断arguments的length来辨别参数不同的情况。

function doAdd() {
	if(arguments.length == 1) {
		alert(arguments[0] + 10);
	} else if (arguments.length == 2) {
		alert(arguments[0] + arguments[1]);
	}
}

 虽然这个特性算不上完美的重载,但也足够弥补 ECMAScript 的这一缺憾了。

arguments有callee属性(是指针):指向拥有这个arguments对象的函数。
eg:arguments.callee - 获得函数名

可通过这个来实现递归。在使用函数递归调用时推荐使用arguments.callee代替函数名本身。

function count(a){
2     if(a==1){
3         return 1;
4     }
5     return a + arguments.callee(--a);
6 }
7
8 var mm = count(10);
9 alert(mm);

通过使用 arguments.callee 代替函数名,可以确保无论怎样调用函数都不会
出问题。因此,在编写递归函数时,使用 arguments.callee 总比使用函数名更保险。
但在严格模式下,不能通过脚本访问 arguments.callee ,访问这个属性会导致错误。不过,可以使用命名函数表达式来达成相同的结果。

var factorial = (function f(num){
	return num * f(num-1);
});

  以上代码创建了一个名为 f() 的命名函数表达式,然后将它赋值给变量 factorial 。即便把函数赋值给了另一个变量,函数的名字 f 仍然有效,所以递归调用照样能正确完成。这种方式在严格模式和 非严格模式下都可以行的通。

时间: 2024-11-03 21:20:05

对javascript中的arguments对象的认识的相关文章

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

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /* *1.js 中不存在函数的重载 2.js函数定义时候的形参个数,和执行时候时,传递的实参的个数可以不一样. 3.js执行时候,会将真实的参数,封

javascript中的arguments对象

在js中一切都是对象,连函数也是对象,函数名其实是引用函数定义对象的变量. 1.什么是arguments? 这个函数体内的arguments非常特殊,实际上是所在函数的一个内置类数组对象,可以用数组的[i]和.length. 2.有什么作用? js语法不支持重载!但可用arguments对象模拟重载效果. arguments对象:函数对象内,自动创建的专门接收所有参数值得类数组对象. arguments[i]: 获得传入的下标为i的参数值 arguments.length: 获得传入的参数个数!

JavaScript中使用arguments来实现不定参数的计算

在JavaScript中可以使用arguments对象来实现不定参数 例如:不定参数的相加实现 add(1,2)      ==>3 add(1,2,3)   ==>6 var add = function(){ var total = 0; for(var index = 0;index < arguments.length; index++){ total = total + arguments[index]; } return total; } alert("1加2的值是

在JavaScript中重写jQuery对象的方法

jQuery是一个很好的类库,它给我们解决了很多的客户端编程,任何东西都不是万能的,当它不能满足我们的需求时我们需要对它进行重写,同时也不要影响其原有的功能或者修改其原有的功能:我现在的web应用程序大多数时候的数据交互都是通过Ajax来完成的,这样就可以将一些隐藏字段的数据保存在HTML标签的属性中,使HTML标签的代码量减少,如:ID,Timestamp等等,这些不需要用户输入但又不得不提交的字段,通过表单提交的做法是 <input name="ID" value="

详解javascript中的this对象

详解javascript中的this对象 前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的设计模式来实现面向对象的编程,其中this "指针"就是实现面向对象的一个很重要的特性.但是this也是Javascript中一个非常容易理解错,进而用错的特性.特别是对于接触静态语言比较久了的同志来说更是如此. 示例说明 我们先来看一个最简单的示例: <script type=&q

JavaScript中的arguments,callee,caller,call,appy

<script language="JavaScript">/* * 演示arguments的用法,如何获取实参数和形数数 */function argTest(a,b,c,d){    var numargs = arguments.length;     // 获取被传递参数的数值.    var expargs = argTest.length;       // 获取期望参数的数值.    alert("实参数目为:"+numargs)    a

函数中的 arguments 对象

JavaScript函数具有像数组一样的对象,这些对象称为arguments,与传递给函数的参数相对应.传递给JavaScript函数的所有参数都可以使用arguments对象来引用. 现在我们开始学习,仔细看下面列出的代码: function add(num1, num2) { var res = num1 + num2; return res; } var r = add(7, 8); console.log(r); 在上面的函数中,num1和num2是两个参数.你可以使用名为num1和nu

【拾遗】理解Javascript中的Arguments

前言 最近在看JavaScript相关的知识点,看到了老外的一本Javascript For Web Developers,遇到了一个知识盲点,觉得老外写的很明白很透彻,记录下来加深印象,下面是我摘出来的一些片段,片段下有对应的解释,希望也能帮助其他人扫除这个盲点.如有翻译的不得体的地方还请在评论区指出,不胜感激. 理解Javascript中的Arguments Function arguments in ECMAScript don’t behave in the same way as fu

JavaScript中的String对象

String对象提供的方法用于处理字符串及字符. 常用的一些方法: charAt(index):返回字符串中index处的字符. indexOf(searchValue,[fromIndex]):该方法在字符串中寻找第一次出现的searchValue.如果给定了fromIndex,则从字符串内该位置开始搜索,当searchValue找到后,返回该串第一个字符的位置. lastIndexOf(searchValue,[fromIndex]):从字符串的尾部向前搜索searchValue,并报告找到