Javascript'参数'关键字

时间:2013-02-10 23:37:37

标签: javascript

我的理解是我可以调用Array.prototype.slice.call(arguments, 1)来返回数组的尾部。

为什么这段代码不会返回[2,3,4,5]

function foo() {  
    return Array.prototype.slice.call(arguments,1);
}

alert(foo([1,2,3,4,5]));

3 个答案:

答案 0 :(得分:13)

arguments是一个类似于数组的对象,它列出了参数和一些其他属性(例如对arguments.callee中当前函数的引用)。

在这种情况下,您的arguments对象如下所示:

arguments {
    0: [1,2,3,4,5],
    length: 1,
    other properties here
}

我认为这可以解释你所看到的行为。尝试删除函数调用中的数组括号,或使用arguments[0]访问arry。

答案 1 :(得分:11)

因为您只传递一个参数 - 数组。

尝试alert(foo(1,2,3,4,5));

在JavaScript中,参数从0开始编号,因此当您从1开始切片并传递1个参数时,您什么也得不到。

请注意,它可能会妨碍优化,以允许arguments对象“泄漏”出函数。由于arguments和形式参数之间的别名,如果arguments对象被发送到其他地方,优化器就无法对函数进行任何静态分析,因为它不知道会发生什么。参数变量。

答案 2 :(得分:3)

因为arguments{0: [1,2,3,4,5], length: 1},它是一个具有一个元素的类数组对象。带有一个元素的数组的尾部是空数组。

更改功能的定义:

function foo(arr) {  
    return Array.prototype.slice.call(arr,1);
}

或用以下方法调用该函数:

foo(1,2,3,4,5);