Javascript:形式参数和参数对象之间的区别是什么?

时间:2014-01-16 13:47:03

标签: javascript parameters

这是测试代码:

function fn(i, j) {
    arguments = [3, 4];
    console.log(i, j); // 1, 2
    console.log(arguments); // [3, 4]
}

fn(1, 2);

在函数中,我重置了arguments对象

但是,参数对象被更改了,但传入的形式参数没有被修改,我认为它们是相同的,那么它们有什么区别?

2 个答案:

答案 0 :(得分:2)

arguments是一个类似数组的对象,它引用了传递给它的所有参数。在这里,您只需重新分配arguments以指向其他对象。如果要更改实际参数,则必须更改arguments的元素,如此

function fn(i, j) {
    arguments[0] = -1;
    console.log(i, j);      // -1, 2
    console.log(arguments); // { '0': -1, '1': 2 }
}

fn(1, 2)

引自arguments, MDN docs

  

arguments对象不是Array。它类似于数组,但是   除了length之外没有任何Array属性。例如,确实如此   没有pop方法。

     

但是它可以转换为真正的数组:

     

var args = Array.prototype.slice.call(arguments);

     

如果是数组泛型   可用,可以使用以下代码:

     

var args = Array.slice(arguments);

答案 1 :(得分:0)

您正在使用新数组替换arguments数组(实际上是类数组对象)。它们是独立的物体并排存在。替换arguments变量的引用不会使函数使用新数组作为参数,它仍然具有对原始对象的内部引用。

如果更改arguments对象的内容,它将反映函数参数:

function fn(i, j) {
    arguments[0] = 3;
    arguments[1] = 4;
    console.log(i, j); // 3, 4
    console.log(arguments); // [3, 4]
}

fn(1, 2);