什么是类数组对象(array-like object)

May 28, 2020 ... ☕️ 2 min read

有的对象,属性看起来像数组,遍历起来像数组,取值/赋值都很像数组,但是最后某些坑里的朋友(我)会告诉你,他们不叫数组,只是类数组对象。那么

什么是类数组对象(array-like object)

指一个对象包含非负的整数型length属性,通常还包含索引属性。例如:

var ao1 = {length:0}; // like []
var ao2 = {0: 'foo', 5: 'bar', length: 6}; // like ['foo', undefined x 4, 'bar']

类数组对象可以像数组一样执行读写、获取长度(length)、遍历的操作。

console.log(ao2[0]); // foo 
ao2[0] = 1;
console.log(ao2.length); // 6

类数组对象不能使用数组的方法(push、pop等),但是可以使用Array.prototype.xxx.call()来调用。

Array.prototype.push.call(ao2, '6');
console.log(ao2); // {0: "foo", 5: "bar", 6: "6", length: 7}

类数组对象可以转换为数组

// 1. slice
Array.prototype.slice.call(ao2); // ["foo", undefined, undefined, undefined, undefined, "bar"]
// 2. splice
Array.prototype.splice.call(ao2, 0); // ["foo", undefined, undefined, undefined, undefined, "bar"] 
// 3. ES6 Array.from
Array.from(ao2); // ["foo", undefined, undefined, undefined, undefined, "bar"]
// 4. apply
Array.prototype.concat.apply([], ao2) // ["foo", undefined, undefined, undefined, undefined, "bar"]

有哪些常用的类数组对象

判断一个对象不是数组很简单,Array.isArray(),判断是类数组对象只需要看对象有没有length属性。满足这两个条件就是类数组对象

  • NodeList

    var nodes = document.querySelectorAll('c');
    nodes.length; // 5
    Array.isArray(nodes); // false
  • 字符串

    var str = '123456';
    str.length; // 6
    Array.isArray(str); // false
  • 函数的arguments参数

    function foo (argA, argB, argC) {
    console.log(arguments.length);
    console.log(Array.isArray(arguments));
    }
    foo('a', 'b', 'c');

参考链接

#what-is

SideEffect is a blog for front-end web development.
Code by Axiu / rss