类数组是什么?

js中偶尔会听到一个奇怪的名词,类数组(array-like)。又是一个奇怪的翻译,类,容易让人联想起class,英文名就不会有歧义。在前端,常见的有2种类数组,一种是函数的参数arguments,一种是获取的dom节点,document.getElementsByTagName以及jquery,zepto封装的方法。不禁要问什么是类数组,类数组和真正的数组有什么区别?为什么不能直接用Array的方法,用Array.prototype.method.call(array-like)却可以?

回到一切问题的起源,什么是类数组?
js有array和object,如果array-like不是array,那么必然是object。
举个列子:

1
2
3
4
(function(){
//object!!! 注意,箭头函数没有arguments
console.log(typeof arguments)
})()

很容易测试arguments是object,不是数组。

如何构造一个类数组?
更深刻的问,如何构造一个类似数组的对象,可以通过下标0123访问,有length长度?答案呼之欲出。

1
2
3
4
5
6
var obj = {
0: 'hello world',
1: 'hello react',
2: 'hello vue',
legth : 3
}

为什么可以用Array.prototype.method.call?
初步的理解是Array的内置方法实现了对类数组的遍历,待详查。