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章 基本概念