从JavaScript中的参数中删除参数

时间:2013-11-11 10:17:35

标签: javascript arrays arguments javascript-objects

我希望函数调用有一个可选的boolean参数:

function test() {
  if (typeof(arguments[0]) === 'boolean') {
    // do some stuff
  }
  // rest of function
}

我希望函数的其余部分只能看到arguments数组而不是可选的boolean参数。我意识到的第一件事是arguments数组不是数组!它似乎是一个标准的Object,其属性为0,1,2等。所以我不能这样做:

function test() {
  if (typeof(arguments[0]) === 'boolean') {
    var optionalParameter = arguments.shift();

我收到shift()不存在的错误。那么有一种简单的方法可以从arguments对象的开头删除一个参数吗?

3 个答案:

答案 0 :(得分:23)

arguments不是数组,它是一个类似于对象的数组。您可以通过访问Array.prototype来调用arguments中的数组函数,然后通过使用.apply()

argument作为其执行上下文来调用它

尝试

var optionalParameter = Array.prototype.shift.apply(arguments);

演示

function test() {
    var optionalParameter;
    if (typeof (arguments[0]) === 'boolean') {
        optionalParameter = Array.prototype.shift.apply(arguments);
    }
    console.log(optionalParameter, arguments)
}
test(1, 2, 3);
test(false, 1, 2, 3);

我在某些地方见过的另一个版本是

var optionalParameter = [].shift.apply(arguments);

演示

function test() {
    var optionalParameter;
    if (typeof (arguments[0]) === 'boolean') {
        optionalParameter = [].shift.apply(arguments);
    }
    console.log(optionalParameter, arguments)
}
test(1, 2, 3);
test(false, 1, 2, 3);

答案 1 :(得分:2)

正如Arun所指出的,arguments不是数组

您必须转换为数组

var optionalParameter = [].shift.apply(arguments);

答案 2 :(得分:1)

这不是花哨但是删除没有副作用的第一个参数的最佳解决方案(没有像shift那样以额外的参数结束)可能是

  for (var i=0;i<arguments.length;i++) arguments[i]=arguments[i+1];

示例:

function f(a, b, c, d) {
  for (var i=0;i<arguments.length;i++) arguments[i]=arguments[i+1];
  console.log(a,b,c,d); 
}
f(1,2,3,4); // logs 2,3,4,undefined