Реализуйте полифил (свою версию) статического метода Array.from
под названием Array.from2
.
Array.from
принимает три аргумента:
Для простоты будем считать, что у нас всегда передаются корректные аргументы. Например, не будет вызовов, где первым агрументом передается null
или вторым аргументом передается не функция.
Понятие iterable означает, что объект перебираемый. На практике это значит, что мы можем развернуть его через spread синтаксис, перебрать с помощью цикла for of или использовать на нем деструктуризацию. У iterable сущности реализован метод Symbol.iterator.
const map = new Map(); map.set(1, "a"); map.set(2, "b"); console.log(Array.from(map)); // [[1, "a"], [2, "b"]]
Понятие array-like означает, что у объекта есть длина и индексы.
const obj = {0: "x", 1: "y", length: 2}; console.log(Array.from(obj)); // ["x", "y"]
Статические методы — это не просто функции, которые для удобства положили внутрь класса. Иногда они также используют тот факт, что при вызове мы указываем, внутри какого класса они находятся. Это тоже нужно учесть в решении.
// При наследовании метод from создает экземляр наследуюемого класса class MyArray extends Array {} const a1 = MyArray.from("hello"); console.log(a1 instanceof MyArray); // Если вызвать метод from как обычную функцию, создается массив класса Array const {from} = Array; const a2 = from("hello"); console.log(a2 instanceof Array);
Подробнее про Array.from
можно прочитать в соответствующем разделе Array.from() на MDN.