类数组转化为数组,你悟了吗?

110 阅读1分钟

首先我们要分清数组与类数组的区别:所谓的类数组就是只拥有数组的索引和长度,并没有数组的方法,例如:在jQuery的each()方法当中

<ul class="ul1">
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
</ul>
<script type="text/javascript">
    var result = $(".ul1>li");
    $.each(result,function(index,ele){
        console.log(index,ele);
        console.log(result);
    })
</script>

jQuery(选择器)它返回的是一个JQuery对象,是一个类数组形式,在上面调用$each的时候,里面的result就是一个类数组。

在函数中arguments也是一个类数组。

在DOM操作元素中,我们也会得到一个类数组,例如document.getElementsByClassName()

我们知道,数组的原型是Array,而数组里面所拥有的方法是继承自原型Array;类数组的原型是object,也就是类数组之所以没有数组的方法,是因为它的原型里没有这些方法,从而无法实现继承。说到这里就已经很明确了,如果我们想让一个类数组转换为数组,也就是让其有数组的方法,就可以通过改变类数组的原型,让原型里面有这个方法,从而让类数组继承原型的方法,那么就可以实现类数组到数组的转化。

在这里提供五种让类数组转换为数组的方法:

第一种:

var lis = document.querySeletorAll(".ul1>li")
var arr = Array.prototype.slice.call(lis)  //改变this的指向

第二种:

var lis = document.querySeletorAll(".ul1>li")
var arr = $(lis).toArray();  //通过jQuery中的toArray()将类数组转化为数组

第三种:

var lis = document.querySeletorAll(".ul1>li")
var arr = $.makeArray(lis);

第四种:在ES6中使用...运算符来完成

var lis = document.querySeletorAll(".ul1>li")
var arr2 = [...lis];

第五种:在ES6中使用Array.from()扩展方法

var lis = document.querySeletorAll(".ul1>li")
var arr3 = Array.from(lis);