12

我想要boolean一个函数调用的可选参数:

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

我希望函数的其余部分只看到没有可选参数的arguments数组。我意识到的第一件事是数组不是数组!它似乎是具有0、1、2 等属性的标准。​​所以我不能这样做:booleanargumentsObject

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

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

4

3 回答 3

28

arguments不是数组,它是一个类似对象的数组。arguments您可以通过访问来调用数组函数,Array.prototype然后通过将其argument作为执行上下文传递来调用它.apply()

尝试

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);

于 2013-11-11T10:19:42.643 回答
2

正如 Arun 指出arguments的不是数组

你将不得不转换成一个数组

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

于 2013-11-11T10:23:24.783 回答
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
于 2013-11-11T10:27:33.170 回答