这是测试代码:
function fn(i, j) {
arguments = [3, 4];
console.log(i, j); // 1, 2
console.log(arguments); // [3, 4]
}
fn(1, 2);
在函数中,我重置了arguments
对象
但是,参数对象被更改了,但传入的形式参数没有被修改,我认为它们是相同的,那么它们有什么区别?
答案 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对象不是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);