从 JavaScript 中的参数中删除参数

Removing an argument from arguments in JavaScript

本文关键字:参数 删除 JavaScript      更新时间:2023-09-26

我想为函数调用提供一个可选的boolean参数:

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

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

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

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

arguments

是一个数组,它是一个类似数组的对象。可以通过访问 Array.prototypearguments 中调用数组函数,然后通过使用 .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);

正如Arun指出的那样arguments不是一个数组

您必须转换为数组

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

这并不花哨,但删除第一个参数而没有副作用的最佳解决方案(不像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