zoukankan      html  css  js  c++  java
  • 关于在函数中使用Array.prototype.slice.call而不是直接用slice

      arguments是每个函数在运行的时候自动获得的一个近似数组的对象(除了length外没有其他属性),这个arguments对象其实并不是Array,所以没有slice方法。

      Array.prototype.slice.call( )可以间接对其实现slice的效果,而且返回的结果是真正的Array。

      slice实现数据浅拷贝,原数据不会被修改。

    //查看 V8 引擎 array.js 的源码,可以将 slice 的内部实现简化为:  
       
     function slice(start, end) {   
         var len = ToUint32(this.length), result = [];   
         for(var i = start; i < end; i++) {   
             result.push(this[i]);   
         }   
         return result;   
     }       
    //可以看出,slice 并不需要 this 为 array 类型,只需要有 length 属性即可。并且 length 属性可以不为 number 类型,当不能转换为数值时,ToUnit32(this.length) 返回 0. 

    调用方式:

    [].slice.call(arguments)
    Array.prototype.slice.call(arguments) //最高效
    new Array().prototype.slice.call(arguments)

    转换成数组的通用函数

    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;
        } 
    }
  • 相关阅读:
    Evaluate Reverse Polish Notation(逆波兰表达式)
    PostreSQL linux添加psql 命令
    C#用文件流读取cvs内容并返回DataTable,并把第一行设为列名
    鹅鹅鹅饿饿
    编译器和解释器
    delphi之多线程编程
    Arduino 板子 COM 接口找不到设备
    JS事件冒泡
    vi编辑器的使用(2)
    vi编辑器的使用(1)
  • 原文地址:https://www.cnblogs.com/chenlogin/p/7509366.html
Copyright © 2011-2022 走看看