详解 Array.prototype.slice.call(arguments)

首先,slice有两个用法,一个是String.slice,一个是Array.slice,第一个返回的是字符串,第二个返回的是数组

在这里我们看第二个方法

 

1.在JS里Array是一个类 slice是此类里的一个方法
  那么使用此方法应该Array.prototype.slice这么去用
  slice从字面上的意思很容易理解就是截取(当然你不是英肓的话)
  这方法如何使用呢?
  arrayObj.slice(start, [end]) 很显然是截取数组的一部分

2.我们再看call
  call([thisObj[,arg1[arg2[[argN]]]]])
  thisObj是一个对象的方法
  arrg1~argN是参数
  那么Array.prototype.slice.call(arguments,1);这句话的意思就是说把调用方法的参数截取出来。
  如:
   function test(a,b,c,d)
   {
      var arg = Array.prototype.slice.call(arguments,1);
      alert(arg);
   }
   test("a","b","c","d");
   结果是:
  image
  这样应该能理解了吧。
3. 然后我再看apply
   apply([thisObj[,argArray]])
   thisObj:
               可选项 将被用作当前对象的对象。
   argArray
              可选项 将被传递给该函数的参数数组。
4. 来一个实例重写setTimeout 我们知道Timeout不能传参数。(这个可真是不好)

Js代码
  var timeout = window.setTimeout;  
  window.setTimeout = function(func,delay){  
    var args = Array.prototype.slice.call(arguments,2); 
    var f = (function(){func.apply(null, args); }); 
    return timeout(f, delay); 
  } 
  function  test(){ 
    for   (var   i=0;i<arguments.length;i++) 
      alert(arguments[i]);
    } 

  }

  window.setTimeout(test,1000,'fason',window,123,[5,6,7],new   Object());

 

5、实际参数在函数中我们可以使用 arguments 对象获得 (注:形参可通过 arguments.callee 获得),虽然 arguments 对象与数组形似,但仍不是真正意义上的数组。

  我们可以通过数组的 slice 方法将 arguments 对象转换成真正的数组。

  方法一var args = Array.prototype.slice.call(arguments);

  方法二:var args = [].slice.call(arguments, 0);

  方法三:

  var args = []; 
  for (var i = 1; i < arguments.length; i++) { 
    args.push(arguments[i]);
  }

  注:一般的函数的 arguments.length 都在 10 以内,方法二有优势; 方法二的代码量上也比第一种少,至少可以减小一点字节

  下面附一个例子:

  function revse(){
    var args = Array.prototype.slice.call(arguments);
    newarr=[];
     for(var i=args.length-1;i>=0;i--){ 
      newarr.push(args[i]);
    }
     return args;
  }
  var s=revse('a','b','c');
  console.log(s);

最后,附个转成数组的通用函数

var toArray = function(s){
    try{
        return Array.prototype.slice.call(s);
    } catch(e){
            var arr = [];
            for(var i = 0,len = s.length; i < len; i++){
                //arr.push(s[i]);
                   arr[i] = s[i];  //据说这样比push快
            }
             return arr;
    }
}

 

posted @ 2016-04-11 16:26  品读夜的黑  阅读(972)  评论(0编辑  收藏  举报