三种类数组转数组的方法

125 阅读2分钟

引言:类数组/伪数组就是含有length属性(且length非负)的对象,在结构表现上非常像一个数组,但它不是数组,也没有数组原型上的数组特有的方法。常见的类数组对象有:1.普通函数的argument对象;2.获取dom节点集合的方法的返回值(document.querySelectorAll()等等)

而想要在这些类数组对象上使用数组原型上的方法,就需要将它们先转化为数组才行,下面就让我们一起来看看有哪些方法可以将类数组转化为数组

一、Array.prototype.slice.call()或者[].slice.call()

两者效果一样,除了写法不一样外,没有任何区别

const likeArr = { 1: 'a', 2: 'b', 3: 'c', 4: 'd', length: 9 };
const arr1 = Array.prototype.slice.call(likeArr);
const arr2 = [].slice.call(likeArr);
console.log(arr1); // [ <1 empty item>, 'a', 'b', 'c', 'd', <4 empty items> ]
console.log(arr2); // [ <1 empty item>, 'a', 'b', 'c', 'd', <4 empty items> ]
console.log(Array.isArray(arr1)); // true
console.log(Array.isArray(arr2)); // true

!!! empty的特殊值,是因为在slice迭代时会跳过不存在的索引属性,也可以被认为为未被初始化,但区别于undefined的是,empty不会被forEach、map等内置方法传入到回调函数中参与迭代

二、Array.from,ES6 新出的方法

const likeArr = { 1: 'a', 2: 'b', 3: 'c', 4: 'd', length: 9 };
const arr = Array.from(likeArr);
console.log(arr); // [ undefined, 'a', 'b', 'c', 'd', undefined, undefined, undefined, undefined ]
console.log(Array.isArray(arr)); // true

!!! 区别于上述的Array.prototype.slice.call(),不存在的索引被设置为undefined,当一个对象是类数组对象,且可以迭代,就会使用该对象的迭代器方法

三、... 扩展运算符,必须是类数组,且可以迭代才能使用

四、注意:

  • 是类数组但不可迭代:可以使用 Array.prototype.slice.call() 和 Array.from();
  • 是类数组且可以迭代:可以使用...和 Array.from();
  • 开发中遇到的类数组对象都是 JS 内置方法返回的,同时也是可迭代对象;
  • Array.prototype.slice.call()会对不存在的索引维持为 empty;
  • Array.from()会对不存在的索引维持为undefined;