本文主要介绍一下类数组的定义和将类数组转化为数组的方法。
1.定义
满足两个条件的对象就是类数组。
(1)有length属性,最好加上push方法
(2)属性要为索引属性
如下:
var arr = {
"0": "a",
"1": "b",
"2": "c",
length: 3
};
类数组判断
function isArrayLike(arr){
if(arr & typeof(arr) === "object" && isFinite(arr.length) && arr.length >= 0 && arr.length === Math.floor(arr.length) && arr.length < 4294967296){
return true;
}else{
return false;
}
}
类数组并不能直接使用数组的方法,需要用call()或者apply()调用数组的方法。
类似于这样
var obj = {
"0": "a",
"1": "b",
"2": "c",
length: 3
};
Array.prototype.join.call(obj,"+"); //"a+b+c"
思考以下问题:
var obj = {
"2": "a",
"3": "b",
"4": "c",
length: 3
};
Array.prototype.push.call(obj,"d"); //{2: "a", 3: "d", 4: "c", length: 4}
这里push的原理是:
Array.prototype.push = function(target){
obj[obj.length] = target;
obj.length++;
}
push方法的插入位置是由length决定的。插入之后length加1 。
2. 类数组转化为数组
第一种方法:
var obj = {
"0": "a",
"1": "b",
"2": "c",
length: 3
};
var b = [];
for (var i = 0; i < obj.length; i++){
b.push(obj[i]);
} //["a","b","c"];
第二种方法:
var obj = {
"0": "a",
"1": "b",
"2": "c",
length: 3
};
var array = Array.prototype.slice.call(obj,0); //截取obj返回一个新数组
第三种方法,ES6中的方法,只要有length属性都可以应用此方法。
var obj = {
"0": "a",
"1": "b",
"2": "c",
length: 3
};
var array = Array.from(obj);
第四种方法:jQuery的makeArray方法
var obj = {
"0": "a",
"1": "b",
"2": "c",
length: 3
};
var array = $.makeArray(obj);
第五种方法:
var newArr = […obj]; //可以应用ES6的扩展运算符