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中,系统生成的数组样的大部分均为类数组。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值