使用JavaScript Arguments对象混淆行为

时间:2017-09-09 08:14:32

标签: 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]。

但如果我将第4行更改为

arr = arr.filter(function(x){return x != arguments[i];});

当我期待[1,1]时,我得到[1,2,3,1,2,3]。为什么会这样?

1 个答案:

答案 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));