zoukankan      html  css  js  c++  java
  • 详解 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;
        }
    }

  • 相关阅读:
    js 中的 EventLoop
    线程的并发工具类
    xpath获取某个节点下的全部字节点的文本
    2020中国 .NET开发者大会精彩回顾:葡萄城高性能表格技术解读
    .NET 控件集 ComponentOne V2020.0 Update3 发布,正式支持 .NET 5
    log4net配置
    TP5.1 爬虫
    pip下载慢
    TP5.1 二维码生成
    composer插件集合
  • 原文地址:https://www.cnblogs.com/chengqiaoli/p/5378900.html
Copyright © 2011-2022 走看看