函数的形参和实参之arguments对象

参考:https://www.cnblogs.com/leaf930814/p/6658815.html

当函数调用函数时候传入的实参比函数声明时候制定的形参要少时候,剩余的形参就设置成了undefined。eg:

function fn(a,b,c) {
    console.log(a, b, c);
    console.log(arguments); // 类似数组的 [1,2]
}
fn(1,2); // 1 2 undefined

当函数调用函数时候传入的实参比函数声明时候制定的形参要多时候,eg:

function fn(a,b,c) {
    console.log(a, b, c);
    console.log(arguments);// 类似数组的:[1,2,3,4]
}
fn(1,2,3,4); // 1 2 3 

arguments对象在JS中应该算数比较特殊的对象。长得有点像数组,但绝对不是Array的实例。 eg:

function test() {
    console.log(test.arguments); // 类似数组:[1,2]
    console.log(arguments); // 类似数组:[1,2]
    console.log(test.arguments===arguments); // false
    console.log(test.arguments==arguments); // false
    console.log(test.arguments.length); // 2
    console.log(arguments.length); // 2
    console.log(test.arguments[0]); // 1
    console.log(arguments[0]); // 1
    console.log(test.arguments[1]); // 2
    console.log(arguments[1]); // 2
}
test(3,4);
function test(a,b,c) {
    a=100;
    console.log(arguments[0]); // 100
    console.log(arguments[1]); // 3
    c=100;
    console.log(arguments[2]); // undefined
    console.log(arguments); // length为2,类似数组的:[1,2]
}
test(1,2);

说明:
1.arguments实际上是当前函数的一个内置属性,在当前函数内,函数名.arguments等价于arguments,在函数外单独使用arguments是没有意义的;
2.arguments对象的长度由实际参数个数决定。
3.函数中的形参和实参是可以相互影响的。当传入的实参个数少于形参个数的时候,以实参为准。实际上,函数的实参已经存入到arguments对象中了。

顾名思义,就是像数组的对象,当然,数组本身就是对象嘛!稍微有点基础的同学,一定知道 arguments 就是 Array-Like Objects 的一种,能像数组一样用 [] 去访问 arguments 的元素,有 length 属性,但是却不能用一些数组的方法, 如 push,pop,等等。

arguments有一个callee属性,用于调用自己(递归)eg:

function sum(n) {
    if(n==1){
        return 1;
    }else{
        return n+arguments.callee(n-1);
    }
}
console.log(sum(6)); // 21,相当于:6+5+4+3+2+1
1、arguments像数组,是一个Arguments对象实例。

2、arguments有length属性,代表传给函数的参数个数。

3、可以数组下标访问参数,如arguments[0],无数组其它方法。

4、存储的是实参不是行参。

5、可以使用callee属性调用自身。

猜你喜欢

转载自blog.csdn.net/weixin_42995876/article/details/87877122