我希望函数调用有一个可选的boolean
参数:
function test() {
if (typeof(arguments[0]) === 'boolean') {
// do some stuff
}
// rest of function
}
我希望函数的其余部分只能看到arguments
数组而不是可选的boolean
参数。我意识到的第一件事是arguments
数组不是数组!它似乎是一个标准的Object
,其属性为0,1,2等。所以我不能这样做:
function test() {
if (typeof(arguments[0]) === 'boolean') {
var optionalParameter = arguments.shift();
我收到shift()
不存在的错误。那么有一种简单的方法可以从arguments
对象的开头删除一个参数吗?
答案 0 :(得分:23)
arguments
不是数组,它是一个类似于对象的数组。您可以通过访问Array.prototype
来调用arguments
中的数组函数,然后通过使用.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);
答案 1 :(得分:2)
正如Arun所指出的,arguments
不是数组
您必须转换为数组
var optionalParameter = [].shift.apply(arguments);
答案 2 :(得分:1)
这不是花哨但是删除没有副作用的第一个参数的最佳解决方案(没有像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