什么是类数组对象(array-like object)
2020年5月28日 • ... • ☕️ 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');