玄机随录程序员

JS之类数组对象以及转换方法大全

2020-04-25  本文已影响0人  shandamengcheng

什么是类数组对象

有length属性和若干索引属性的对象。

var array = ['name', 'age', 'sex'];

var arrayLike = {
    0: 'name',
    1: 'age',
    2: 'sex',
    length: 3
}

为什么叫类数组

类数组对象可以执行一些常见的数组操作,比如读写数据、获取长度(length属性)、遍历

array[0]   //name
arrayLike[0] //name

array[0] = "Jona";   //Jona age sex
arrayLike[0] = "Jonason";  // 0 : Jonason
array.length //3
arrayLike.length // 3
for(let i=0;i<arrayLike.length;i++)
console.log(arrayLike[i]);
// name age sex

虽称为类数组但是他不是真正的数组,因此直接调用数组的方法会报错。
可以通过Function.call来间接调用。

Array.prototype.slice.call(arguments);

类数组转换为数组

[].slice.call(arrayLike)
[].splice.call(arraayLike)
[].map.call(arrayLike,(item)=>{return item})
[].filter.call(arrayLike,(item)=>{return item})
[].forEach.call(arrayLike.(item)=>{arr.push(item)}) //创建一个数组
[].reduce.call(arrayLike,(pre,cur)=>{return pre.concat(cur)},[]);
//([].reduceRight.call(arrayLike,(pre,cur)=>{return pre.concat(cur)},[])).reverse();  
//本想通过这样实现,不过这种方法是从后往前遍历,
//如果Length属性放到arrayList最后面,就无法正常转换出来
[].concat.apply([],arguments); //注意空数组的位置

Array.from()方法可以接受一个可迭代对象或类数组对象作为第一个参数,返回一个数组。如果想对类数组对象有进一步的操作,可以在from()方法中传入一个映射函数作为第二个参数。

Array.from(arguments);
let arr = [...arguments]

这里要特别注意: 展开运算符只能用于可迭代对象,对于arguments,nodelist这样的内置iterator接口的可以用这种方式,类似arrayLike的对象,需要给Symbol.iterator属性添加一个生成器,就可以变成一个可迭代对象。

var arrayLike = {
    0:"name",
    1:"age",
    2:"gender",
    *[Symbol.iterator]() {
        yield arrayLike[0];
        yield arrayLike[1];
        yield arrayLike[2];
    }
}

这样通过[...arrayLike]就可以获得一个数组了

常见的类数组对象

NodeList中拥有默认的迭代器,其行为与数组的默认迭代器相同,即使用的是内置的values()迭代器

参考

JavaScript深入之类数组对象与arguments

上一篇下一篇

猜你喜欢

热点阅读