我有以下代码:
function destroyer(arr) {
for(var i=1; i<arguments.length; i++){
var kill = arguments[i];
arr = arr.filter(function(x){return x != kill;});
}
return arr;
}
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));
它从数组中删除等于可选参数的元素。这段代码给出了[1,1]。
但如果我将第4行更改为
arr = arr.filter(function(x){return x != arguments[i];});
当我期待[1,1]时,我得到[1,2,3,1,2,3]。为什么会这样?
答案 0 :(得分:2)
因为当您在匿名函数中使用arguments
时,您正在访问 函数的参数,而不是destroyer()
。
您需要复制arguments
destroyer()
,最好是在循环之前,如下所示:
function destroyer(arr) {
var args = arguments;
for(var i=1; i < args.length; i++)
{
arr = arr.filter(function(x){return x != args[i];});
}
return arr;
}
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));
或者,也可以使用arrow function来实现相同的功能:
function destroyer(arr) {
for(var i=1; i<arguments.length; i++){
arr = arr.filter(x => x != arguments[i]);
}
return arr;
}
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));