arguments(类数组对象):
当我们在js中在调用一个函数的时候,我们经常会给这个函数传递一些参数,js把传入到这个函数的所有参数变成一个类数组存储在arguments里面。
接下来我们具体看看例子:
<script type="text/javascript">
function exam() {
console.log(arguments);
}
exam(1,2,3,4,5,6);
</script>
下面我们用console.log的方式,将arguments对象输出到控制台
这里我们可以看到,arguments对象将我传入的六个参数以数组的形式保存在里面,还有保存了我传入函数的实参的个数(length)。而且我们可以看到arguments对象的__proto__是指向object的,这也说明了他是个类数组对象,而不是一个数组。
总结一下:在存储类数组的同时(类数组),arguments还有length属性和__proto__属性(对象),所以我们把它称之为类数组对象。
下面我们来看看arguments的应用:
- 判断当前传入参数的个数是否与我们需要的数量一致
function add() {
if( arguments.length == 2 ){
return arguments[0] + arguments[1];
}else{
return '传入参数不合法';
}
}
console.log( add(1,2) );
console.log( add(1,2,3) );
//3 传入参数不合法
引用自身(将自身原原本本的引用下来),这条属性多用于下面的递归
arguments.callee
代表函数名,多用于递归调用,防止函数执行与函数名紧紧耦合的现象(引用该函数的函数体内当前正在执行的函数),对于没有函数名的匿名函数也非常起作用。
示例:
<script type = "text/javascript">
var num = (function (n){ //构造函数 无函数名
if(n==1){
return 1;
}
return n*arguments.callee(n-1); //递归时找不到函数名,此时用callee来等效函数本身
}(20))
</script>
辨析:caller(不是arguments上的属性)
<script type = "text/javascript">
function test() {
demo();
}
function demo() {
console.log(demo.caller); //函数自己的属性,在那个环境被调用就等效哪个环境
}
test();
</script>
// function test() {
demo();
}
- arguments.length
可以计算出类数组长度len = arguments.length,经常在循环中使用。
function add() {
var len = arguments.length,
sum = 0;
for(;len--;){
sum += arguments[len];
}
return sum;
}
console.log( add(1,2,3) ); //6
console.log( add(1,2,3,4) ); //10