如何从“争论”中分一杯羹

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

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

那么问题来了,如何从 arguments中除了第一个元素之外切割所有的东西呢?

UPD :

似乎没有办法不把它转换成一个数组

var args = Array.prototype.slice.call(arguments);

如果有人发布了另一个解决方案,这将是伟大的,如果没有-我将检查第一个与上面的行作为一个答案。

41983 次浏览

如何从 arguments中切除除第一个元素以外的所有元素?

下面将返回一个数组,其中包含除第一个参数之外的所有参数:

var slicedArgs = Array.prototype.slice.call(arguments, 1);

您不必首先将 arguments转换为数组,一步就可以完成所有操作。

您可以通过过程性地遍历参数对象来“不切片地切片”:

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]

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

您不应该对参数进行切片,因为它会阻止 JavaScript 引擎(例如 V8) 通过遍历参数对象来实现数组。

因此,保罗 · 罗西亚纳的上述答案是正确的

这可以是一种方式:

var args = Array.from(arguments).slice(1);

实际上没有必要干预数组函数。

使用 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");

休息

可以使用方法 [].slice.call(arguments, 1)

[].片将返回片函数对象,您可以调用它,因为 arguments1是参数

您可以在函数中使用... rest 来分隔第一个参数和其余的参数:

function foo(arr) {
const [first, ...rest] = arguments;
console.log(`first = ${first}`);
console.log(`rest = ${rest}`);
}
//Then calling the function with 3 arguments:
foo(1,2,3)

你也可以用这个

function arg(myArr) {
let arg = Object.values(arguments).slice(2, 4);
console.log(arg);
return arg;
};


arg([1, 2, 3], 4, [5,6], 7)

请参阅此处: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values

...

Arguments类型是可迭代的,因此使用 ES6 (ES2015)扩展 ...操作符,然后使用 Array.slice([start], [end])方法,如

function omitFirstAndLastArgument(value) {
const args = arguments.length > 2 ? [...arguments].slice(1, -1) : [];
return args;
}


omitFirstAndLastArgument(1, 2, 3, 4, 5, 6); //  [2, 3, 4, 5]