类数组对象汇总

      JavaScript中有一些看起来像却又不是数组的对象,叫做类数组。 现在要探究类数组的确切含义和高效的使用方式。

   1. 类数组

   一个类数组对象:

  • 具有:指向对象元素的数字索引下标以及 length 属性告诉我们对象的元素个数
  • 不具有:诸如 push 、 forEach 以及 indexOf 等数组对象具有的方法;

   几个典型的类数组的例子是:

  1. DOM方法 document.getElementsByClassName() 的返回结果(实际上许多DOM方法的返回值都是类数组);
  2. 特殊变量 arguments 对象;
  3. input的文件对象FileList

   例如你可以通过以下方法确定函数参数的个数

             

   你也可以获取单个参数值 :  

             

   可以遍历获取每个参数的值: 

       

   特性: 可以使用join()方法将类数组对象合并成字符串, 可以使用slice()方法获取类数组对象上的子数组

      

   2. 通用方法

      所谓的通用方法就是不强制要求函数的调用对象 this 必须为数组,仅需要其拥有 length 属性和数字索引下标即可。 通常来讲,你可以用如下的方式在数组 arr 上调用方法 m :

     

    所有的函数都拥有一个 call 方法来让我们用这样一种方式进行上述调用:

     

   我们可以“通用地”使用 forEach方法: 

  3.将类数组对象转化为数组

  有时候处理类数组对象的最好方法是将其转化为数组。 这项工作一般使用如下的方法来完成:

我们经常会碰到Array.prototype.slice.call(arguments,1)这种用法,这句话的意思就是说把调用方法的参数截取出来:

      function test(a,b,c,d){
               var arg = Array.prototype.slice.call(arguments, 1);
               console.log(arg);
       }
       test('a','b','c','d');// ['b','c','d'];

在这里,增加一个转为数组的通用方法:

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

4. 类数组判断

 《javascript权威指南》上给出了代码用来判断一个对象是否属于“类数组”。如下:

function isArrayLike(o) {
    if( o // o不是null、undefined等
       && typeof o === 'object' // o的数据类型为'object'
       && isFinite(o.length) // o.length是有限数值
       && o.length >= 0 // o.length为非负值
       && o.length === Math.floor(o.length) // o.length是整数
       && o.length < 4294967296 // o.length < 2^32
    ) return true
    else
       return false
}
原文地址:https://www.cnblogs.com/xuzhudong/p/8064304.html