将行为与JavaScript对象参数混淆

将行为与JavaScript对象参数混淆,javascript,Javascript,我有以下代码: 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]时,我得到[1,

我有以下代码:

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]时,我得到[1,2,3,1,2,3]。为什么会出现这种情况?

因为当您在匿名函数中使用
参数时,您访问的是该函数的参数,而不是
destroyer()

您需要复制
destropher()
参数,最好在循环之前,如下所示:

功能销毁程序(arr){
var args=参数;
对于(变量i=1;i日志(驱逐舰([1,2,3,1,2,3],2,3))因为当您在匿名函数中使用
参数时,您访问的是该函数的参数,而不是
destructor()

您需要复制
destropher()
参数,最好在循环之前,如下所示:

功能销毁程序(arr){
var args=参数;
对于(变量i=1;i日志(驱逐舰([1,2,3,1,2,3],2,3))
在第二种情况下,使用内部函数的
参数
对象,而不是外部函数。可以使用箭头表示法
arr=arr.filter(x=>x!=arguments[i])
在第二种情况下,使用内部函数的
参数
对象,而不是外部函数。可以使用箭头表示法
arr=arr.filter(x=>x!=arguments[i])当然,如果您要使用ES6<代码>函数销毁程序(arr,…args){返回arr.filter(x=>!args.includes(x));}
当然,如果要使用ES6<代码>函数销毁程序(arr,…args){返回arr.filter(x=>!args.includes(x));}
arr = arr.filter(function(x){return x != arguments[i];});