- 可以利用属性名模拟数组的特性
- 可以动态增长length属性
- 如果强行让类数组调用push方法,则会根据length属性值的位置进行属性的扩充
var obj = {
'0': 'a',
'1': 'b',
'2': 'c',
'length': 3,
'push': Array.prototype.push
}
obj.push('d');
console.log(obj); // {0: "a", 1: "b", 2: "c", 3: "d", length: 4, push: ƒ}
- 类数组特点
属性要为索引(数字),必须要有length,最好加上push方法
// 如果加上splice属性 就长的和数组一样
var obj = {
'0': 'a',
'1': 'b',
'2': 'c',
'length': 3,
'push': Array.prototype.push,
'splice': Array.prototype.splice
}
obj.push('d');
console.log(obj); // Object(4) ["a", "b", "c", "d", push: ƒ, splice: ƒ]
- 练习
var obj = {
'2': 'a',
'3': 'b',
'length': 2,
'push': Array.prototype.push
}
obj.push('c'); // 类数组的push方法是根据length来改变
console.log(obj); // {2: "c", 3: "b", length: 3, push: ƒ}
// 封装一个type 返回所有数据类型值
function type(target) {
var template = {
'[object Array]': 'array',
'[object Object]': 'object',
'[object String]': 'string -- object',
'[object Number]': 'number -- object',
'[object Boolean]': 'boolean -- object',
}
var ret = typeof target;
if (target === null) {
return 'null';
} else if (ret === 'object') {
var str = Object.prototype.toString.call(target);
return template[str];
} else {
return ret;
}
}