如何从"参数"中获取切片

zer*_*kms 74 javascript

所有你知道的arguments是一个特殊的对象,它包含传递给函数的所有参数.

只要它不是一个数组 - 你就不能使用类似的东西arguments.slice(1).

那么问题 - 如何切割除第一个元素之外的所有元素arguments

UPD:

似乎没有办法没有将它转换为数组

var args = Array.prototype.slice.call(arguments);
Run Code Online (Sandbox Code Playgroud)

如果有人发布另一个解决方案,那将是很好的,如果没有 - 我将检查第一个上面的行作为答案.

nnn*_*nnn 131

问:除了第一个元素之外,如何切割所有内容arguments

以下将返回一个包含除第一个以外的所有参数的数组:

var slicedArgs = Array.prototype.slice.call(arguments, 1);
Run Code Online (Sandbox Code Playgroud)

您不必先转换arguments为数组,只需一步即可完成.

  • 建议[此处](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments)声明您不应在参数上使用slice,因为它会阻止JavaScript引擎优化. (4认同)
  • @David - "详细信息"链接仍然表示不对`arguments`使用`.slice()`,但给出的唯一理由是它阻止了JS引擎优化该函数.所以它并不是失败,它只是*可能*更慢.我不打算编写代码以满足当今JS引擎中的优化,而不是明天的引擎可能已经解决了优化问题,并且在任何情况下,差异可能在大多数情况下都不会被用户察觉案例.最好先编写清晰且易于维护的代码,然后仅在出现可测量的性能问题时再返回并进行优化. (4认同)

Umu*_*göz 13

插入数组函数实际上并不是必需的.

使用rest参数语法 ...rest更清晰,更方便.

function argumentTest(first, ...rest) {
  console.log("First arg:" + first);

  // loop through the rest of the parameters
    for(let arg of rest){
        console.log("- " + arg);
    }
}

// call your function with any number of arguments
argumentTest("first arg", "#2", "more arguments", "this is not an argument but a contradiction");
Run Code Online (Sandbox Code Playgroud)

...休息

  • 现在又过了一年,我认为是时候转向新的ES标准了:-) (2认同)

Pau*_*nia 11

您可以通过程序性地遍历参数对象来"切片而不切片":

function fun() {
  var args = [];

  for (var i = 1; i < arguments.length; i++) {
    args.push(arguments[i]);
  }

  return args;
}

fun(1, 2, 3, 4, 5); //=> [2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

  • +1这似乎是V8唯一正确的解决方案.在这里查看优化基准测试:http://jsperf.com/leaky-args (3认同)
  • 是的,它完成了工作,但是如果我们有一个`.slice()`;-)就没有意义 (2认同)

blu*_*bie 11

来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments:

您不应该对参数进行切片,因为它会阻止JavaScript引擎中的优化(例如V8).相反,尝试通过遍历arguments对象来构造一个新数组.

所以保罗罗西亚娜的答案是正确的

  • 可能是吧.但是我没有看到优化引擎如何处理接受的答案的单行并且以他们希望的任何方式对其进行优化.如果我们开始编写优化器(当天)的代码,从长远来看总是令人讨厌 - 我个人更喜欢清晰的代码. (4认同)
  • '切片'不会改变.它返回原始数组中元素的浅表副本.原始数组的元素将复制到返回的数组中.所以我无法理解手动复制到新阵列和切片之间的区别. (2认同)

Di *_*ran 8

这可以是一种方式:

var args = Array.from(arguments).slice(1);
Run Code Online (Sandbox Code Playgroud)