{{JS}}可变长度的参数列表: Arguments对象

{{JS}}可变长度的参数列表: Arguments对象
在一个函数体内, 标识符arguments具有特殊含义. 它是引用Arguments对象的一个特殊属性. Arguments对象是一个类似数组的对象, 可以按照下标获取传递给函数的参数值. Arguments对象也定义了callee属性.

Arguments对象可以用于多个方面.
1. 检测函数调用时是否具有正确数目的实参.
function f(a, b) {
    if(arguments.length !== 2) {
        throw new Error("函数期待2个参数");
    }
    //todo : 
}

2. 编写可变参数函数
function max(/* ... */) {
    var m = Number.NEGATIVE_INFINITY;
    for(var i = 0; i < arguments.length; i++) {
        if(arguments[i] > m) {
            m = arguments[i];
        }
    }
    return m;
}

var largest = max(3, 5, 100, 88, 99, 11, 10000);

3. Arguments对象有一个非同寻常的特性. 当函数具有命名了的参数时, Arguments对象的数组元素是存放函数参数的局部变量的同义词. arguments[]数组和命名了的参数不过是引用同一变量的两种不同方法. 用参数名改变一个参数的值同时会改变通过arguments[]数组获得的值. 通过arguments[]数组改变参数的值也会相应的改变用参数名获取的参数值.如下例:
function f(a) {
    console.log(a);
    arguments[0] = null;
    console.log(a);
}

f(1);

4. 最后请记住arguments只是一个普通的JS标记符, 而不是一个保留字. 如果函数中有一个参数或者局部变量使用了这个名字, 它就会隐藏对Arguments对象的引用. 如下例:
function e(a) {
    var arguments = 1;      // 隐藏对Arguments对象的引用
    console.log(arguments);
}

function f(a) {
    console.log(arguments); // 仍然指向Arguments对象的引用
    var arguments = 1;
}

function g(arguments) {     // 隐藏对Arguments对象的引用
    console.log(arguments); 
}

e(1,2);
f(1,2);
g(1,2);

故最好把arguments当作一个保留字并避免将其用作变量名.

你可能感兴趣的:({{JS}}可变长度的参数列表: Arguments对象)