Что такое массив в JavaScript

«Что такое массив в JavaScript» — вопрос из категории JavaScript, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Массив в 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:

  1. Динамический размер:

    const arr = [];
    arr.length = 0; // Пустой массив
    arr.push('new'); // Добавление в конец
    arr.pop();       // Удаление с конца
    arr.unshift('first'); // Добавление в начало
    arr.shift();          // Удаление с начала
  2. Методы для обработки данных:

    
    // Преобразование
    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]);
}
  1. Типизированные массивы (для бинарных данных):
    
    // 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 оптимизирует массивы, содержащие однотипные данные