你知道arguments
是一个特殊的对象,它包含传递给函数的所有参数。
只要它不是数组 - 你就不能使用像arguments.slice(1)
这样的东西。
所以问题是 - 如何从arguments
开始切割除第一个元素之外的所有元素?
UPD :
似乎没有办法将它转换为带有
的数组var args = Array.prototype.slice.call(arguments);
如果有人发布了另一个解决方案,那就太好了,如果不是的话 - 我会用上面的一行作为答案检查第一个。
答案 0 :(得分:129)
问。如何从arguments
以下将返回一个包含除第一个以外的所有参数的数组:
var slicedArgs = Array.prototype.slice.call(arguments, 1);
您不必先将arguments
转换为数组,只需一步即可完成。
答案 1 :(得分: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]
答案 2 :(得分:11)
来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments:
你不应该对参数进行切片,因为它会阻止优化 JavaScript引擎(例如V8)。相反,尝试构建一个新的 数组通过遍历参数对象。
所以Paul Rosiana上面的回答是正确的
答案 3 :(得分:9)
实际上并不需要干预数组函数。
使用rest parameter syntax ...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");
<强> ...休息强>
答案 4 :(得分:6)
这可以是一种方式:
var args = Array.from(arguments).slice(1);
答案 5 :(得分:0)
您可以使用方法[].slice.call(arguments, 1)
[]。切片会返回切片功能对象,您可以将其称为arguments
,1
是参数
答案 6 :(得分:0)
您可以在函数内使用... 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)