zoukankan      html  css  js  c++  java
  • Array.prototype.slice.call(arguments)

    Array.prototype.slice.call(arguments) 是将有length属性的对象转换成数组的常用方法,我们想把arguments对象转换成数组,就应该从数组的常用方法里找答案,查看api后,发现slice方法可以满足我们的需求,slice 方法的定义是从已有的数组中返回选定的元素。slice有两个用法,一个是String.slice,一个是Array.slice,第一个返回的是字符串,第二个返回的是数组,这里我们用第2个方法。

    思路

    Array.prototype.slice.call(arguments) 的过程就是先将传入进来的第一个参数转为数组,再调用slice

    首先我们需要梳理小知识点

    slice() 方法返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象。原始数组不会被修改。 

    [].slice == Array.prototype.slice (true)  实际上是相同的,底层实现是同一个方法,不同点 this的指向不同 ,一个指向[],一个指向Array.prototype

    1 传入多个参数的arguments对象是什么样的?

    2 Array.prototype.slice.call(arguments) 中的 call 方法做了什么工作?

       此处的 call 方法的作用就是将arguments强制转换成数组  

    [12, 13, 14, 5, callee: ƒ, Symbol(Symbol.iterator): ƒ]

    3 Array.prototype.slice 方法是怎么实现的?

    Array.prototype.slice = function(start,end){
         var result = new Array();
         start = start || 0;
         end = end || this.length; 
         for(var i = start; i < end; i++){
              result.push(this[i]);
         }
         return result;
    }

    4 (扩展)类数组对象转换成数组的三种方法?

    Array.prototype.slice.call(arguments)
    
    [].slice.call(arguments) 
    
    var slice = Function.prototype.call.bind(Array.prototype.slice);

    5 通用方法

    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;
        }
    }

     感谢 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/slice

    每天一点点积累
  • 相关阅读:
    底层因为接受到操作系统信号而停止的解决
    C语言判断文件是否存在
    Linux磁盘设备文件(sda,sdb,sdc…)变化问题
    linux mysql 数据目录文件夹移动及所遇到的问题
    Linux Mysql如何移动MySQL数据库目录位置
    Linux 磁盘挂载和mount共享
    提高VS2010/VS2012编译速度
    C++[类设计] ini配置文件读写类config
    WIN32读写INI文件方法
    MS509Team----------------Cknife
  • 原文地址:https://www.cnblogs.com/dreamone/p/7448659.html
Copyright © 2011-2022 走看看