В двух упражнениях на сайте excism.io (Матрица и Треугольник Паскаля) я хотел создать массив пустых массивов. Есть много способов сделать это. Мой ум новичка по умолчанию использует forEach
, for
петли или while
петли. Однако есть и другие варианты.
Я нашел эту статью о stackoverflow полезной. О двух новых вариантах я узнал из статьи.
Вариант 1: Array.prototype.fill
const emptyRows = new Array(4).fill([]);
console.log(emptyRows);
// returns [[], [], [], []] in Sublime
// returns [[], [circular object array], [circular object array], [circular object array]] in CodePen
Это кажется действительно элегантным, легко читать код и понимать, что он делает. Однако вывод CodePen меня смущает. Что такое [circular object array]
? Почему первый элемент []
соответствует ожиданиям, а остальные - другим?
Еще больше сбивает с толку то, что когда я использую этот код и вызываю emptyRows
в методе, я получаю фатальную ошибку: нехватка памяти в куче JavaScript. Не знаю почему. Я полагаю, этот вариант работал бы хорошо, если бы я заполнял массив чем-то другим, кроме []
.
Вариант 2: Array.from
const emptyRows = Array.from(Array(4), () => []); console.log(emptyRows); // returns [[], [], [], []] in Sublime // returns [[], [], [], []] in CodePen
Этот вариант работает хорошо. Для меня нет роковой ошибки. Я не вполне понимаю, как это работает, даже с объяснением StackOverflow. Но вот моя попытка сломать это.
Array(4)
создает массив из четырех undefined
объектов: [undefined, undefined, undefined, undefined]
.
() => []
выполняет итерацию по каждому undefined
элементу и заменяет его на []
. Однако вы не можете использовать Array(4).map(() => [])
. Это то, чего я не совсем понимаю. То есть я не понимаю, почему map
отличается и не может быть использован. Но идем дальше.
Array.from
делает из этого массив. Примеры в документации для разработчиков Mozilla, на мой взгляд, рассматривают более простые варианты использования, так что это тоже не совсем понятно для меня. А именно зачем мне вообще Array.from
? Но я приму это и пойду пока. Надеюсь, в будущем я пойму, как это работает.