Ответ
Массив в JavaScript — это упорядоченная коллекция элементов с числовой индексацией (начиная с 0). В Node.js массивы реализованы как объекты с оптимизациями для работы с последовательными данными.
Создание массивов:
// Литерал массива
const fruits = ['apple', 'banana', 'orange'];
// Конструктор Array
const numbers = new Array(1, 2, 3);
// Array.of() - создает массив из аргументов
const chars = Array.of('a', 'b', 'c');
// Array.from() - создает массив из итерируемого объекта
const fromString = Array.from('hello'); // ['h', 'e', 'l', 'l', 'o']
const fromSet = Array.from(new Set([1, 2, 2, 3])); // [1, 2, 3]
Ключевые особенности массивов в Node.js:
-
Динамический размер:
const arr = []; arr.length = 0; // Пустой массив arr.push('new'); // Добавление в конец arr.pop(); // Удаление с конца arr.unshift('first'); // Добавление в начало arr.shift(); // Удаление с начала -
Методы для обработки данных:
// Преобразование const doubled = [1, 2, 3].map(x => x * 2); // [2, 4, 6]
// Фильтрация const evens = [1, 2, 3, 4].filter(x => x % 2 === 0); // [2, 4]
// Свертка const sum = [1, 2, 3].reduce((acc, val) => acc + val, 0); // 6
// Поиск const found = [{id: 1}, {id: 2}].find(item => item.id === 2); // {id: 2}
// Проверка условий const allPositive = [1, 2, 3].every(x => x > 0); // true const hasNegative = [1, -2, 3].some(x => x < 0); // true
3. **Работа с асинхронными операциями:**
```javascript
// Обработка массива файлов асинхронно
const fs = require('fs').promises;
const path = require('path');
async function processFiles(filePaths) {
// Параллельное чтение файлов
const promises = filePaths.map(filePath =>
fs.readFile(filePath, 'utf8')
);
const contents = await Promise.all(promises);
// Последовательная обработка
for (const content of contents) {
await processContent(content);
}
// Фильтрация с асинхронным предикатом
const validFiles = await filterAsync(filePaths, async (filePath) => {
const stats = await fs.stat(filePath);
return stats.size > 0;
});
}
async function filterAsync(array, predicate) {
const results = await Promise.all(array.map(predicate));
return array.filter((_, index) => results[index]);
}
- Типизированные массивы (для бинарных данных):
// Buffer в Node.js работает с типизированными массивами const buffer = Buffer.from([1, 2, 3, 4]); const uint8Array = new Uint8Array(buffer);
// Int32Array для работы с 32-битными целыми const intArray = new Int32Array([100, 200, 300]); console.log(intArray.length); // 3 console.log(intArray.BYTES_PER_ELEMENT); // 4
5. **Производительность в Node.js:**
```javascript
// Для больших массивов используйте for вместо forEach
const largeArray = new Array(1000000).fill(0);
// Медленнее
largeArray.forEach(item => { /* обработка */ });
// Быстрее
for (let i = 0; i < largeArray.length; i++) {
// обработка largeArray[i]
}
// Еще быстрее для типизированных массивов
for (const item of largeArray) {
// обработка item
}
Важные нюансы:
- Массивы в JavaScript могут содержать элементы разных типов
Array.isArray()— надежный способ проверки, является ли значение массивом- Разреженные массивы (с "дырками") могут вести себя неожиданно
- В Node.js V8 оптимизирует массивы, содержащие однотипные данные
Ответ 18+ 🔞
Ну ты представляешь, этот JavaScript, он такой, блядь, хитрая жопа. Вот берёшь ты массив — а это, по сути, просто упорядоченная куча всего подряд, пронумерованная с нуля, как будто ты в очереди за колбасой в девяностые встал. В Node.js это, конечно, объекты, но такие прокачанные, чтобы с данными быстро работать.
Создание, ёпта:
// Самый простой способ — в квадратных скобках
const fruits = ['apple', 'banana', 'orange']; // яблоки-бананы, ебушки-воробушки
// Через new Array — выглядит пафосно, но осторожно, там подвох может быть
const numbers = new Array(1, 2, 3);
// Array.of() — создаёт из того, что ты туда сунешь
const chars = Array.of('a', 'b', 'c');
// Array.from() — вот это мощь, можно из чего угодно массив сделать
const fromString = Array.from('hello'); // ['h', 'e', 'l', 'l', 'o']
const fromSet = Array.from(new Set([1, 2, 2, 3])); // [1, 2, 3] — дубли, бля, нахуй ушли
А теперь главные фишки, чувак:
-
Размер динамический, терпения ноль ебать. Можешь растягивать и сжимать как хочешь.
const arr = []; arr.length = 0; // Обнулил — и всё, пустота. arr.push('new'); // Толкаешь в конец. arr.pop(); // Выдернул с конца — и нету. arr.unshift('first'); // Запихнул в самое начало, все остальные сдвинулись, ядрёна вошь. arr.shift(); // Выдрал первый элемент — остальные опять поехали. -
Методы — это вообще песня, овердохуища возможностей.
// map — прогоняешь всё через функцию, как через мясорубку const doubled = [1, 2, 3].map(x => x * 2); // [2, 4, 6] // filter — отсеиваешь всё ненужное, как мусор из крупы const evens = [1, 2, 3, 4].filter(x => x % 2 === 0); // [2, 4] // reduce — сводишь всё к одному значению, типа итог подводишь const sum = [1, 2, 3].reduce((acc, val) => acc + val, 0); // 6 // find — ищешь первый подходящий элемент, как ключи в куртке const found = [{id: 1}, {id: 2}].find(item => item.id === 2); // {id: 2} // every / some — проверяешь, все ли или хоть один условие выполняют const allPositive = [1, 2, 3].every(x => x > 0); // true const hasNegative = [1, -2, 3].some(x => x < 0); // true, вот же он, гад, затесался -
Асинхронщина в Node.js — это отдельный цирк.
const fs = require('fs').promises; async function processFiles(filePaths) { // Запускаешь кучу чтений файлов параллельно — мощно const promises = filePaths.map(filePath => fs.readFile(filePath, 'utf8') ); const contents = await Promise.all(promises); // Ждёшь, пока все дочитают // А потом можешь обрабатывать по очереди, если порядок важен for (const content of contents) { await processContent(content); } } -
Типизированные массивы — для серьёзных бинарных дел.
// Buffer в Node.js с ними дружит const buffer = Buffer.from([1, 2, 3, 4]); const uint8Array = new Uint8Array(buffer); // Вот тебе и сырые байты // Int32Array — для целых чисел, чтоб по 4 байта ровненько const intArray = new Int32Array([100, 200, 300]); console.log(intArray.length); // 3 console.log(intArray.BYTES_PER_ELEMENT); // 4 — вот сколько каждый элемент жрёт памяти -
Производительность, блядь! С большими массивами шутить нельзя.
const largeArray = new Array(1000000).fill(0); // Миллион нулей, ёперный театр! // forEach — красиво, но для таких дел не самый шустрый largeArray.forEach(item => { /* обработка */ }); // Старый добрый for — часто быстрее, проверено for (let i = 0; i < largeArray.length; i++) { // делаешь что-то с largeArray[i] }
И напоследок, чтоб ты не обжёгся:
- Можешь пихать в массив что угодно: числа, строки, объекты, другие массивы —
доверия ебать нольк типам. - Хочешь точно узнать, массив перед тобой или нет —
Array.isArray(), не доверяйtypeof. - Разреженные массивы (с дырками) — это пиздец, они могут вести себя как
хуй в пальто, неожиданно и странно. - Держи данные однотипными — V8 в Node.js это любит и оптимизирует под это дело.
Видео-ответы
▶
▶
▶
▶
▶
▶