• 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++/c语言中如何调用DLL
    fortran出现stack overflow的原因及解决办法
    iOS: ARC和非ARC下使用Block属性的问题
    Objective-C Autorelease Pool 的实现原理
    class-dump 复制到/usr/bin目录不可写,Operation not permitted 解决办法
    Auto Layout 使用心得
    iOS-关于微信支付
    IOS应用安全(五):高级Runtime分析和操作
    Objective-C Runtime 运行时之六:拾遗
    Objective-C Runtime 运行时之五:协议与分类
  • 原文地址:https://www.cnblogs.com/dreamone/p/7448659.html
Copyright © 2020-2023  润新知