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)]
扩展运算符实际上调用的是遍历器接口,如果一个对象没有部署此接口就无法完成转换。
