鍍金池/ 問答/HTML/ js中為什么傳入?yún)?shù)可以用filter

js中為什么傳入?yún)?shù)可以用filter

實現(xiàn)一個摧毀(destroyer)函數(shù),第一個參數(shù)是待摧毀的數(shù)組,其余的參數(shù)是待摧毀的值。

    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 不是傳入的參數(shù)嗎?為什么可以用array的方法?
          return arr_arg[i] !== val;     
        });  
        }  
      return arr;  
    }  
    destroyer([1, 2, 3, 1, 2, 3], 2, 3);  

兩個問題在注釋里 有點基礎(chǔ) 希望老鐵解答

回答
編輯回答
別逞強(qiáng)

樓上回答的很好了。
題主可能沒有理解arguments
推薦看看MDN arguments
arguments 是一個對應(yīng)于傳遞給函數(shù)的參數(shù)的類數(shù)組對象。(實際傳入的參數(shù))
這里的destroyer函數(shù)第一個參數(shù)arguments[0] 就是這里申明的arr形式參數(shù),也就是 [1, 2, 3, 1, 2, 3],所以可以用filter方法。其他的參數(shù)是arguments[1],arguments[2]依此類推。
所以你可以運行下這個函數(shù),加上console.log(),可以看出函數(shù)是怎么執(zhí)行的。

2017年5月4日 05:37
編輯回答
神曲
function destroyer(arr) {    
  var arr_arg = arguments;
  // - 這一步是不是等同于 var arr_arg = Array.prototype.slice.call(arguments)
  // 這一步「不等同于」var arr_arg = Array.prototype.slice.call(arguments)
  // arguments 本身是一個類數(shù)組,并沒有數(shù)組的方法
  // 但是 Array.prototype.slice.call(arguments) 返回的是一個真正的數(shù)組,可以使用數(shù)組方法
  // 類數(shù)組和數(shù)組的差別在于,類數(shù)組更像是一個有數(shù)字索引的對象,即像下面這樣:
  // 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 不是傳入的參數(shù)嗎?為什么可以用array的方法?
      // arr 傳入的就是一個數(shù)組 [1, 2, 3, 1, 2, 3]
      return arr_arg[i] !== val;     
    });  
    }  
  return arr;  
}  
destroyer([1, 2, 3, 1, 2, 3], 2, 3); 
2017年12月21日 23:07