ECMAScript函数不介意传递的参数个数,因为在其内部是用一个数组进行表示的。在函数体内可以通过arguments对象来访问这个参数数组,就像我们正常访问数组一样处理。
arguments对象只是与数组类似,并不是array的实例。我们可以通过方括号语法访问arguments的每一个元素(arguments[0],arguments[1]。。。。),可以用length属性确定传递进来的参数个数。
function sayHi() {
alert("Hello " + arguments[0] + "," + arguments[1]);
}
与
function sayHi(name, message) {
alert("Hello " + name + "," + message);
}
第一种写法是重写第二种表达方式的,为了突出ECMAScript的一个重要特点:命名的参数只提供便利,但不是必需的。
可以通过访问arguments对象的length属性获取有多少个参数传递给了函数。
function howManyArgs() {
alert(arguments.length);
}
howManyArgs("string", 45); //2
howManyArgs(); //0
howManyArgs(12); //1
我们也可以让函数能够接收任意个参数实现适当的功能,例如:
function doAdd() {
if(arguments.length == 1) {
alert(arguments[0] + 10);
} else if (arguments.length == 2) {
alert(arguments[0] + arguments[1]);
}
}
doAdd(10); //20
doAdd(30, 20); //50
另外一个重点是:arguments对象可以与命名参数一起使用,例如:
function doAdd(num1, num2) {
if(arguments.length == 1) {
alert(num1 + 10);
} else if (arguments.length == 2) {
alert(arguments[0] + num2);
}
}
在上面这个重写的函数中,num1与arguments[0]相同,num2与arguments[1]相同,因此他们可以互换。
还有一个有趣的点,arguments对象的值永远与对应命名参数的值保持同步。
function doAdd(num1, num2) {
arguments[1] = 10;
alert(arguments[0] + num2);
}
doAdd(10, 20);//20
加了'use strict'
function doAdd(num1, num2) {
'use strict'
arguments[1] = 10;
alert(arguments[0] + num2);
}
doAdd(10, 20);//30
严格模式对如何使用arguments 对象做出了一些限制。首先,像前面例子中那样的赋值会变得无效。
参考资料
《javascript高级程序设计(第3版)》第3章 基本概念