Ответ
Массив в 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 оптимизирует массивы, содержащие однотипные данные
Видео-ответы
▶
▶
▶