js 类数组

基本原则

  • 类数组为对象,但有一些数组的方法,用起来像数组,因为其本质为对象,也有对象的用法
  • 属性要为索引(数字)属性,必须有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中,系统生成的数组样的大部分均为类数组。

发布了53 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/bingqise5193/article/details/100170587