基本原则
- 类数组为对象,但有一些数组的方法,用起来像数组,因为其本质为对象,也有对象的用法
- 属性要为索引(数字)属性,必须有length属性,最好加上push方法
举例子
var obj = {
0: 'a',
1: 'a',
2: 'a',
3: 'b',
length: 4,
push: Array.prototype.push
}
obj.push('b');
obj.length; //5
obj[4]; // b
这就是一个类数组,你发现可以使用数组的方法,像数组一样访问值,实际上,深入去看你会发现,obj.push调用的是数组的push方法,obj.length访问的是自己的属性,obj[4]访问的也是自己的属性。
- 智力题
var obj = {
2: 'a',
3: 'b',
length: 2,
push: Array.prototype.push
}
obj.push('c','d','e');
控制台打印obj,你会发现它是长这样子的:
为啥呢,根据之前类数组的push表现,你大概可以猜到,在类数组里面,Array.prototype.push大致表现如下:
Array.prototype.push = function() {
//传入参数个数
var len = arguments.length;
for(var i = 0; i < len; i++){
//属性赋值
this[this.length] = arguments[i];
//将类数组length属性加1
this.length++;
}
return this.length;
}
所以,你执行obj.push('c','d','e')时,首先调用了Array.prototype.push,然后进行对象属性赋值,第一次,直接为属性2赋值,接着为3赋值,之后为4赋值,所以2/3属性值均被覆盖,4由于原来没有,赋值相当于增加了一个属性。
所以,从上面来看,用类数组时时刻要记住,它的本质是一个对象!可以像数组那么访问值及使用,但不能用数组的思维去看它。
另外,在DOM和BOM中,系统生成的数组样的大部分均为类数组。