js类数组用法以及类数组转数组的方法

一、类数组用法

类数组基本形态,属性要为索引(数字)属性,必须有length属性(最重要),最好加上push。 使用起来和数组一样,(可以使用数组的方法,但是使用前必须先在类数组中定义),也可以当成对象使用。存储数据能力更强。

//类数组基本形态,属性要为索引(数字)属性,必须有length属性(最重要),最好加上push
    //使用起来和数组一样,
    var obj={
        "0":"a",
        "1":"b",
        "2":"c",
        name:"类数组",
        age:"18",
        length:3,
        push:Array.prototype.push,
        splice:Array.prototype.splice
    }

题目:

var obj={
        "2":"a",
        "3":"b",
        "length":2,
        "push":Array.prototype.push
    }
    obj.push("c");//先找length=2,length决定了在哪一位开始push值
    obj.push("d");
   /* var obj={
        2:"c",
        3:"d"
    } */
    console.log(obj);//{2: "c", 3: "d", length: 4, push:f}

题目考点:push方法内部原理:

Array.prototype.push=function(target){
        obj[obj.length]=target;//先找length
        obj.length++;
    }

加强理解:

var obj={
        "1":"a",
        "2":"b",
        "3":"c",
        "length":3,
        "push":Array.prototype.push
    }
    obj.push("c");//{1: "a", 2: "b", 3: "c", length: 4, push: ƒ}

二、类数组转数组方法

二、类数组转换为数组的方法

1、Array.prototype.slice.call() 这种方法是借用了数组原型中的slice方法,返回一个数组。slice方法的内部实现:

Array.prototype.slice = function(start,end){  
      var result = new Array();  
      start = start || 0;  
      end = end || this.length; //使用call之后this指向了类数组对象
      for(var i = start; i < end; i++){  
           result.push(this[i]);  
      }  
      return result;  
 }

一个通用的转换函数:

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[i] = s[i];   
            }  
             return arr;  
    }

2、Array.from() Array.from()是ES6中新增的方法,可以将两类对象转为真正的数组:类数组对象和可遍历(iterable)对象(包括ES6新增的数据结构Set和Map)。

var arrayLike = {
    0:a,
    1:b,
    2:c,
    length:3
};
var arr = Array.from(arrayLike);//[a,b,c]
//把NodeList对象转换为数组,然后使用数组的forEach方法
var ps = document.querySelectorAll(p);
Array.from(ps).forEach(p){
    console.log(p);
});                             
//转换arguments对象为数组
function foo(){
    var args = Array.from(arguments);
    //...
}
//只要是部署了Iterator接口的数据结构,Array.from都能将其转换为数组
Array.from(hello);            //[h,e,l,l,o]

3、扩展运算符(…) 同样是ES6中新增的内容,扩展运算符(…)也可以将某些数据结构转为数组

//arguments对象的转换
function foo(){
    var args = [...arguments];
}
//NodeList对象的转换
[...document.querySelectorAll(p)]

扩展运算符实际上调用的是遍历器接口,如果一个对象没有部署此接口就无法完成转换。

经验分享 程序员 微信小程序 职场和发展