arguments对象

来源:互联网 发布:农业 知乎 编辑:程序博客网 时间:2024/05/20 03:43
函数中,有一个默认的对象,不需要你去声明,也不需要你去赋值,它叫做arguments,它是一个数组,保存着参数列表。先来看一个例子:
[javascript] view plain copy
  1. function add(num1, num2) {  
  2.     console.log(arguments); // [1, 2]  
  3.     return num1 + num2;  
  4. };  
  5. var b = add(1, 2);  
注意,arguments对象保存的是实参。接下来,我们要展示JavaScript中非常有意思的一个东西,也是JavaScript灵活性的一大体现。在这之前,我们先来谈下C中的函数重载。
维基中的定义为:函数重载(Function overloading),是Ada、C++、C#、D和Java等编程语言中具有的一项特性,这项特性允许创建数项名称相同但功能的输入输出类型不同的子程序,它可以简单地称为一个单独功能可以执行多项任务的能力。
在函数重载中,输出类型可相同可不同,但参数列表一定要不一样,可以是数量不一样或者类型不一样,或者两者都不一样。
但在JavaScript这类弱类型语言中,类型无法预定义,即输入和输出类型无法从函数定义看出来。那么只剩一项了,参数列表的长度,即参数数量。但这真的有影响吗?
实际上,JavaScript没有函数重载,实参比形参长的后果仅仅是没有给实参一个别名而已。不懂?我们来看下例子:
[javascript] view plain copy
  1. function add(num1, num2) {  
  2.     console.log(arguments); // [1, 2, 3]  
  3.     return num1 + num2 + arguments[2];  
  4. };  
  5. var b = add(1, 2, 3); // 6  
我们可以巧妙的利用arguments对象,来达到我们的目的。我们甚至可以对上面的做个扩展,让它能把所有参数的和返回,即使形参列表为空。
[javascript] view plain copy
  1. function add() {  
  2.     var sum = 0;  
  3.     for(var count = 0, length = arguments.length; count < length; count++) {  
  4.         sum += arguments[count];  
  5.     }  
  6.     return sum;  
  7. };  
  8. var b = add(1, 2, 3, 4); // 10  
那如果相反,形参列表长度比实参列表长呢?
[javascript] view plain copy
  1. function add(num1, num2) {  
  2.     console.log(num1);  // 1  
  3.     console.log(num2);  // undefined  
  4.     return num1 + num2;   
  5. };  
  6. var b = add(1); // NaN  
我们可以看到,超出实参长度的形参部分,就会是undefined,从而返回我们并不想要的结果(NaN表示应该是个number类型结果却是其他类型)。我们可以稍作修改:
[javascript] view plain copy
  1. function add(num1, num2) {  
  2.     num2 = num2 || 0;  
  3.     return num1 + num2;  
  4. };  
  5. var b = add(1); // 1  
利用逻辑操作符的特性来将形参实例化,保证使用时形参不为undefined。当然,这样也有个别问题,如果传入的实参逻辑值也是false(例如0、undefined、null)等等,我们就需要用全等符号进行判断了,在此例中不做要求。
0 0