JavaScript arguments对象详解
arguments 是 JavaScript 函数体中的一个内置对象,虽然经常被人所忽视,但实际上非常重要。所有主流的 JavaScript 函数库都利用了 arguments 对象。
arguments 对象的属性
对于一个对象而言,我们先来看一看arguments对象的三个属性的作用,然后分别来聊聊如何运用这三个属性
1.callee:指向当前函数的引用
2.length:真正传递的参数的个数
3.properties-indexes:函数的参数值(按参数列表从左到右排列)
callee 属性
该属性是一个指针,指向拥有这个 arguments 对象的函数。
下面是一个用到常见的利用 callee 属性定义阶乘函数。
function foo(x) {
return x >= 1 ? x * arguments.callee(x-1) : 1
}
console.log(foo(3)) // 6
定义阶乘函数一般都要用到递归算法,利用 callee 属性可以消除递归函数的执行与函数名 foo 的紧密耦合。
注: 不过由于访问 arguments 是个很昂贵的操作,因为它是个很大的对象,每次递归调用时都需要重新创建。影响现代浏览器的性能,还会影响闭包。
所以arguments.callee
并不赞成使用!
length 属性
通过访问 arguments.length
可以知道有多少个参数传递给了函数。
我们都知道,在 JavaScript 中并没有函数重载的功能,但是借助 arguments.length 可以模拟函数重载。
比如下面这个例子:
function foo() {
if(arguments.length == 1) {
alert("接收到1个参数!");
} else if (arguments.length == 2) {
alert("接收到2个参数!");
}
}
根据参数的个数可以进行函数重载的模拟。
同数组下标访问实参
ECMAScript 函数的参数与大多数其他语言中函数的参数有所不同。ECMAScript 函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。实际上,在函数体内可以通过 arguments 对象来访问这个参数数组,从而获取传递给函数的每一个参数。
——截自红宝书对函数参数的理解
arguments 对象只是与数组类似(并不是 Array 的实例),因为它既可以使用方括号语法访问它的每一个元素(即第一个元素是 arguments[0],第二个元素是 arguments[1],以此类推),也可以访问它的 length 属性来确定传递进来多少个参数。
function foo() {
for(var i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
}
foo("hello,","world!","zwkkkk1");
借助 arguments.length
和下标数组
,我们可以循环输出我们传入的参数,是不是很神奇又方便的功能?