js中为什么传入参数可以用filter

实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值。

    function destroyer(arr) {    
      var arr_arg = arguments; 
      //这一步是不是等同于 var arr_arg = Array.prototype.slice.call(arguments);   
      for(var i = 1; i < arr_arg.length; i++){  
        arr = arr.filter(function(val){  
          //arr 不是传入的参数吗?为什么可以用array的方法?
          return arr_arg[i] !== val;     
        });  
        }  
      return arr;  
    }  
    destroyer([1, 2, 3, 1, 2, 3], 2, 3);  

两个问题在注释里 有点基础 希望老铁解答

阅读 2.5k
2 个回答
function destroyer(arr) {    
  var arr_arg = arguments;
  // - 这一步是不是等同于 var arr_arg = Array.prototype.slice.call(arguments)
  // 这一步「不等同于」var arr_arg = Array.prototype.slice.call(arguments)
  // arguments 本身是一个类数组,并没有数组的方法
  // 但是 Array.prototype.slice.call(arguments) 返回的是一个真正的数组,可以使用数组方法
  // 类数组和数组的差别在于,类数组更像是一个有数字索引的对象,即像下面这样:
  // arguments = { 1: 1, 2: 2, 3: 3, 4: 1, 5: 2, 6: 3 }

  for(var i = 1; i < arr_arg.length; i++){  
    arr = arr.filter(function(val){  
      // - arr 不是传入的参数吗?为什么可以用array的方法?
      // arr 传入的就是一个数组 [1, 2, 3, 1, 2, 3]
      return arr_arg[i] !== val;     
    });  
    }  
  return arr;  
}  
destroyer([1, 2, 3, 1, 2, 3], 2, 3); 

楼上回答的很好了。
题主可能没有理解arguments
推荐看看MDN arguments
arguments 是一个对应于传递给函数的参数的类数组对象。(实际传入的参数)
这里的destroyer函数第一个参数arguments[0] 就是这里申明的arr形式参数,也就是 [1, 2, 3, 1, 2, 3],所以可以用filter方法。其他的参数是arguments[1],arguments[2]依此类推。
所以你可以运行下这个函数,加上console.log(),可以看出函数是怎么执行的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题