Array.from()方法

Array.from()是es6新增的方法,它的作用是将类数组或可迭代对象转换成数组。

数组

Array.from()的内部实现大致如下:

1、首先判断传入的对象是不是「可迭代对象」,如果是「可迭代对象」的话就使用「for…of」遍历对象,将每个元素加入到新数组中。

2、如果传入的对象不是「可迭代对象」,则判断该对象有没有「length」属性,如果连length属性都没有的话就抛出错误;如果有,则用for循环遍历对象,并将每个元素加入到一个新数组中。

3、对于「可迭代对象」和「具有length属性的对象」,我们还可以传入第二个参数「mapFn」,用于对数组中的每个元素进行处理,最终返回一个新数组。

下面的示例代码演示了Array.from()的内部实现:

function arrayFrom(obj, mapFn) {
  // 如果 obj 是可迭代对象,则使用 for...of 遍历
  if (typeof obj[Symbol.iterator] === function) {
    const arr = [];
    for(const item of obj) {
      arr.push(mapFn ? mapFn(item) : item);
    }
    return arr;
  }
  // 如果 obj 具有length 属性,则用 for 循环遍历
  if (typeof obj.length === 'number') {
    const arr = [];
    for(let i = 0; i < obj.length; i++) {
      arr.push(mapFn ? mapFn(obj[i]): obj[i])
    }
    return arr;
  }
  // 如果obj既不是可迭代对象也没有length属性,则抛出错误
  throw new TypeError(`${obj} is not iterable or does ont have a length property`);
}

// 使用示例
const obj = { 0: 'a', 1: 'b', 2: 'c', length: 3 };
const arr1 = arrayFrom(obj); // ['a', 'b', 'c']
const arr2 = arrayFrom(obj, item => item.toUpperCase()); // ['A', 'B', 'C']