类数组是有一个 length 属性和从零开始索引的属性,但是没有 Array 的内置方法,比如 forEach() 和 map() 等的一种特殊对象
特征
- 是一个普通对象(不是函数,不是数组,最基本的 {} 对象)
- 必须有 length 属性,可以有非负整数索引
- 本身不具备数组所具备的方法
常见的类数组
arguments
function person(name, age, sex) {
console.log('arguments: ', arguments);
console.log('type: ', Object.prototype.toString.call(arguments));
}
person('Jae', 23, 'boy');
输出结果如下:
可以看到,arguments 是有 length 属性的,但是没有数组所具备的方法
Dom 相关
例如 NodeList、HTMLCollection、DomTokenList 等
类数组和数组的区别
方法/特征 | 数组 | 类数组 |
---|
自带方法 | 多个方法 | 无 | length属性 | 有 | 有 | toString | [object Array] | [object Object] | instanceof | Array | Object | constructor | [Function: Array] | [Function: Object] | Array.isArray | true | false |
类数组如何转为数组
- slice、concat 等
- Array.from
- Array.apply
- 复制遍历
来一个一个看看效果:
slice、concat
const arr = {
length: 2,
0: 1,
1: 2
};
const arr1 = Array.prototype.slice.call(arr);
console.log(arr1);
const arr2 = Array.prototype.concat.apply([], arr);
console.log(arr2);
Array.from
const arr = {
length: 2,
0: 1,
1: 2
};
console.log(Array.from(obj));
Array.apply
const arr = {
length: 2,
0: 1,
1: 2
};
console.log(Array.apply(null, arr));
遍历
let result = [];
const arr = {
length: 2,
0: 1,
1: 2
};
for (let i = 0; i < arr.length; i++) {
result[i] = arr[i]
}
console.log(result);
|