【问题标题】:How to remove the first argument of function?如何删除函数的第一个参数?
【发布时间】:2016-11-08 12:26:26
【问题描述】:

如果我有一个函数,我可以使用 arguments 变量转发它的所有参数。

现在我有一个函数,它自己需要一个(第一个)参数,并且应该只转发其余的。

例如:

var calledFunction = function(num){
    //do something with num
    //remove num from the arguments
    forwardFunction(arguments);
}

我已经尝试过arguments.shift();,但参数只是一个“类数组对象”,因此不知道shift() 函数。

如何从参数中删除第一个参数并转发其余的参数系列?

【问题讨论】:

  • 在我的学校项目中,我能够将 Arguments 对象转换为数组来处理它。自从我写 JS 以来已经有一段时间了,所以我不记得我是如何做到的。不过应该没那么难。
  • 您想将arguments 中的每个元素1..n 作为单独的参数传递,还是传递一个包含位置1..n 的元素的数组?
  • 每个参数作为一个单独的参数。

标签: javascript arguments


【解决方案1】:

如果你想使用其他函数来做,你可以使用.slice()

    forwardFunction([].slice.call(arguments, 1));

现在,将一个 数组 传递给“forwardFunction”。如果您想将除第一个以外的所有参数作为不同的单独参数传递,则必须使用.apply()

    forwardFunction.apply(undefined, [].slice.call(arguments, 1));

但是,对于需要在调用另一个函数时使用其参数的频繁使用的函数,最好小心使用一个简单的循环将参数复制到一个数组中:

    var a = [];
    for (var i = 1; i < arguments.length; ++i)
      a[i] = arguments[i];
    forwardFunction(a); // or forwardFunction.apply(null, a);

(注意该循环跳过了第一个参数。)如果arguments 对象作为参数传递给另一个函数,则调用函数通常无法优化。有时这没什么大不了的,但重要的是要知道什么时候是大事。

另请参阅 sdgluck 的答案中的解构分配方法。我不知道这是否会导致优化问题;我有点怀疑,但我不确定 ES2015 代码在世界优化运行时系统中的成熟度。

【讨论】:

  • 但是您的第一个示例将传递一个数组,而不是一系列参数(假设这是 OP 想要的,但他的问题表明他认为 forwardFunction 应该传递一个类似数组)。
  • @torazaburo 好吧,目前还不清楚 OP 想要做什么;它没有规定。我会扩展答案。
  • 解构赋值可能会降低可优化性,因为在工作表下它很可能被转译为对某些运行时例程的调用。即使在被原生支持之后,鉴于当前的限制,如果它不继续排除功能被优化,我会感到惊讶。
  • @torazaburo 显然很好,至少在 V8 中,仅引用 .lengtharguments 的索引属性的代码仍然是可优化的。 [...arguments] 似乎至少有可能满足这一点,但谁知道呢。 (好吧,我猜 V8 的人都知道 :)
  • 是的,我想转发一系列参数而不是数组。
【解决方案2】:

在 ES6 中,写这个的惯用方式是

var calledFunction = function(num, ...args) {
  //do something with num
  forwardFunction(...args);
}

【讨论】:

  • 如果目标函数确实需要一个数组,则只需 forwardFunction(args)
  • 与 ES6 解构类似的方法:calledFunction = function(...args) { var [num, ...res] = args; forwardFunction(...res); }
  • 我为那些想玩 ..args 的人创建了一个简单的 JsFiddle:jsfiddle.net/MadCodeMonkey/ew9n3uxh
【解决方案3】:

ES5:

forwardFunction(Array.prototype.slice.call(arguments, 1));

ES6:

forwardFunction([...arguments].slice(1));

【讨论】:

  • 我一直在尝试寻找任何参考来表明这样的解构赋值是否会导致优化问题。它不像它那样似乎。这当然很好看:)
  • 当然可以,但是为什么不在参数中直接解构呢?
  • @torazaburo 我不知道...我没想到? ;-)
猜你喜欢
  • 2019-03-06
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 2017-12-12
  • 2022-10-23
  • 2021-12-20
  • 1970-01-01
  • 2019-10-09
相关资源
最近更新 更多