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']