类数组:跟数组相似,无法使用数组的方法
类数组必须有length属性 需要数组的方法可以自行添加
1、如arguments实参列表是一个数组形式的数据。但无法使用数组的方法。如push。会报错
2、一个对象,里面的键写作索引。加上length属性,与Array的原型方法,既可当数组使用。但本身是对象
// 类数组
function test() {
console.log(arguments);
// 这里的arguments[1,2,3,4,5]。是数组的格式。还有length
// 但无法使用数组的方法
// arguments.push(1);//报错,无push方法
}
test(1,2,3,4,5);
// 比如一个键为索引的对象,并且包含length属性,以及加上Array的方法。
// 就可以当数组一样使用
var obj = {
'0' : "a",
'1' : 'b',
'2' : 'c',
length : 3,
"push" : Array.prototype.push,
"splice" : Array.prototype.splice//加这个可以改成[]这样的格式
}
obj.push(8);
// obj内部会变成{0: "a", 1: "b", 2: "c", 3: 8, length : 4, push:fun}
// 当在obj内部加一个splice方法,obj的样子会变成[]组的格式。
// 但仍旧是对象。可以当数组用
// 逻辑解析:
// obj内的push方法逻辑分析:
Array.prototype.push = function(target){
this[this.length] = target;//添加在最后一位。
this.length++;//并且length++。
// 虽然这里的this[this.length]就是this.[index] 这个索引对应的是obj中键的值
// 不管键的索引,比如第一个键为2,那么这个索引就是2,不是0。
}
衍生面试题
// 衍生面试题
var obj1 = {
'2' : 'a',
'3' : 'b',
length : 2,
"splice" : Array.prototype.splice,//加这个可以改成[]这样的格式
"push" : Array.prototype.push,
}
obj1.push('c');
// 问:最后obj1里的数据是怎样的
// 答案:
obj1 = {'2':'c','3':'b',length:3,push:fun};//前面的0,1位为empty
// 解析:
// 当obj1.push('c');时,push内部的逻辑,将c赋值给obj1[obj1.length];
// 这里的length为2,所以会赋值给obj[2],所以{'2':'c','3':'b',length:3}