概念引入
function test(){
console.log(arguments[0]);
console.log(arguments);
console.log(typeof arguments);
arguments.push(3)
}
test(1,2,4)
arguments(实参列表)看着像是数组,能通过下标输出对应的数据,但数组能调用的方法它都不能调用,且其数据结构也和数组不同,数据类型为object,实际上arguments是类数组
类数组的组成部分
类数组是可以当作数组来使用的对象
- 索引(数字)属性,利用属性名(相当于数组下标)模拟数组的特性
- 必须有length属性,可以动态增长,相当于数组的length属性
- 最好加上push方法,根据length属性值的位置进行属性的扩充
- 还可以加上数组的其他方法,如splice、pop、shift…(不加则不能调用)
let obj = {
'0':'a',
'1':'b',
'2':'c',
'length':'3',
'push':Array.prototype.push,
'name':'yin'
}
该obj对象作为类数组可以和数组一样实现根据下标获取对应元素
在原有基础上可以增加一个splice方法,会让类数组和数组更加相似,但本质上还是对象
let obj = {
'0':'a',
'1':'b',
'2':'c',
'length':'3',
'push':Array.prototype.push,
'name':'yin',
'splice':Array.prototype.splice
}
类数组的push()方法
数组的push方法是根据 数组的length属性值 来进行元素的扩充
//重写push方法模拟原push方法
Array.prototype.push = function(){
for(var i = 0;i<arguments.length;i++){
this[this.length] = arguments[i];
}
return this.length
}
类数组调用自定义的push方法,则会根据其 length属性值 来进行属性的扩充
let obj = {
'2':'a',
'3':'b',
'length':2,//将类数组的length属性值设为2
'push':Array.prototype.push,
'splice':Array.prototype.splice
}
可以看到当length属性值为2时,类数组调用push方法,会将新数据从属性名为’2’(相当于数组的下标2)的属性开始赋值
类数组的优势
具有对象和数组的特性,既可以当作对象来用,也可以当作数组来用(并不是所有的数组方法都能使用,可以自己手动添加)
let obj = {
'0':'a',
'1':'b',
'2':'c',
'3':'d',
'length':4,
name:'yin',
age:12,
'push':Array.prototype.push,
'splice':Array.prototype.splice
}
作为对象遍历属性