Spec-Zone.ru › JavaScript

Array.prototype.forEach()

Базовый уровень Широко доступен

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в версиях браузеров. Она доступна во всех браузерах с июля 2015 года.

Метод forEach() экземпляров Array выполняет предоставленную функцию один раз для каждого элемента массива.

Попробуйте

const array = ["a", "b", "c"];

array.forEach((element) => console.log(element));

// Expected output: "a"
// Expected output: "b"
// Expected output: "c"

Синтаксис

forEach(callbackFn)
forEach(callbackFn, thisArg)

Параметры

callbackFn
Функция, которая будет выполнена для каждого элемента массива. Её возвращаемое значение игнорируется. Функция вызывается со следующими аргументами:
element
Текущий обрабатываемый элемент массива.
index
Индекс текущего обрабатываемого элемента массива.
array
Массив, для которого был вызван forEach().
thisArg Необязательный
Значение, которое будет использоваться как this при выполнении callbackFn. См. итеративные методы.

Возвращаемое значение

Нет (undefined).

Описание

Метод forEach() является итеративным методом. Он вызывает предоставленную функцию callbackFn один раз для каждого элемента массива в порядке возрастания индексов. В отличие от map(), forEach() всегда возвращает undefined и не может быть связан (chainable). Типичный сценарий использования — выполнение побочных эффектов в конце цепочки. Прочтите раздел итеративные методы для получения дополнительной информации о том, как эти методы работают в целом.

callbackFn вызывается только для индексов массива, которым присвоены значения. Он не вызывается для пустых слотов в разреженных массивах.

Метод forEach() является общим. Он ожидает, что значение this будет иметь свойство length и свойства с целочисленными ключами.

Нет способа остановить или прервать цикл forEach(), кроме как путем выбрасывания исключения. Если вам нужно такое поведение, метод forEach() — это неправильный инструмент.

Раннее завершение может быть достигнуто с помощью циклов, таких как for, for...of и for...in. Методы массива, такие как every(), some(), find() и findIndex(), также немедленно останавливают итерацию, когда дальнейшая итерация не требуется.

forEach() ожидает синхронную функцию — он не дожидается промисов. Убедитесь, что вы осведомлены о последствиях при использовании промисов (или асинхронных функций) в качестве обратных вызовов forEach.

const ratings = [5, 4, 5];
let sum = 0;

const sumFunction = async (a, b) => a + b;

ratings.forEach(async (rating) => {
  sum = await sumFunction(sum, rating);
});

console.log(sum);
// Naively expected output: 14
// Actual output: 0

Чтобы выполнить серию асинхронных операций последовательно или параллельно, см. композицию промисов.

Примеры

Преобразование цикла for в forEach

const items = ["item1", "item2", "item3"];
const copyItems = [];

// before
for (let i = 0; i < items.length; i++) {
  copyItems.push(items[i]);
}

// after
items.forEach((item) => {
  copyItems.push(item);
});

Вывод содержимого массива

Примечание: Чтобы отобразить содержимое массива в консоли, вы можете использовать console.table(), который выводит отформатированную версию массива.

Следующий пример иллюстрирует альтернативный подход с использованием forEach().

Следующий код выводит строку для каждого элемента массива:

const logArrayElements = (element, index /*, array */) => {
  console.log(`a[${index}] = ${element}`);
};

// Notice that index 2 is skipped, since there is no item at
// that position in the array.
[2, 5, , 9].forEach(logArrayElements);
// Logs:
// a[0] = 2
// a[1] = 5
// a[3] = 9

Использование thisArg

Следующий (условный) пример обновляет свойства объекта на основе каждой записи в массиве:

class Counter {
  constructor() {
    this.sum = 0;
    this.count = 0;
  }
  add(array) {
    // Only function expressions have their own this bindings.
    array.forEach(function countEntry(entry) {
      this.sum += entry;
      ++this.count;
    }, this);
  }
}

const obj = new Counter();
obj.add([2, 5, 9]);
console.log(obj.count); // 3
console.log(obj.sum); // 16

Поскольку параметр thisArg (this) предоставлен для forEach(), он передается в callback каждый раз, когда он вызывается. Обратный вызов использует его как свое значение this.

Примечание: Если при передаче функции обратного вызова использовалось выражение стрелочной функции, параметр thisArg можно было бы опустить, поскольку все стрелочные функции лексически связывают значение this.

Функция копирования объекта

Следующий код создает копию заданного объекта.

Существуют различные способы создания копии объекта. Следующий пример — лишь один из них и представлен для объяснения того, как работает Array.prototype.forEach(), используя вспомогательные функции Object.*.

const copy = (obj) => {
  const copy = Object.create(Object.getPrototypeOf(obj));
  const propNames = Object.getOwnPropertyNames(obj);
  propNames.forEach((name) => {
    const desc = Object.getOwnPropertyDescriptor(obj, name);
    Object.defineProperty(copy, name, desc);
  });
  return copy;
};

const obj1 = { a: 1, b: 2 };
const obj2 = copy(obj1); // obj2 looks like obj1 now

Сглаживание массива

Следующий пример приведен только в учебных целях. Если вы хотите сгладить массив с помощью встроенных методов, вы можете использовать Array.prototype.flat().

const flatten = (arr) => {
  const result = [];
  arr.forEach((item) => {
    if (Array.isArray(item)) {
      result.push(...flatten(item));
    } else {
      result.push(item);
    }
  });
  return result;
};

// Usage
const nested = [1, 2, 3, [4, 5, [6, 7], 8, 9]];
console.log(flatten(nested)); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

Использование третьего аргумента callbackFn

Аргумент array полезен, если вы хотите получить доступ к другому элементу массива, особенно когда у вас нет существующей переменной, ссылающейся на массив. Следующий пример сначала использует filter() для извлечения положительных значений, а затем использует forEach() для вывода его соседей.

const numbers = [3, -1, 1, 4, 1, 5];
numbers
  .filter((num) => num > 0)
  .forEach((num, idx, arr) => {
    // Without the arr argument, there's no way to easily access the
    // intermediate array without saving it to a variable.
    console.log(arr[idx - 1], num, arr[idx + 1]);
  });
// undefined 3 1
// 3 1 4
// 1 4 1
// 4 1 5
// 1 5 undefined

Использование forEach() на разреженных массивах

const arraySparse = [1, 3, /* empty */, 7];
let numCallbackRuns = 0;

arraySparse.forEach((element) => {
  console.log({ element });
  numCallbackRuns++;
});

console.log({ numCallbackRuns });

// { element: 1 }
// { element: 3 }
// { element: 7 }
// { numCallbackRuns: 3 }

Функция обратного вызова не вызывается для отсутствующего значения по индексу 2.

Вызов forEach() на объектах, не являющихся массивами

Метод forEach() считывает свойство length объекта this, а затем обращается к каждой записи, ключ которой является неотрицательным целым числом, меньшим length.

const arrayLike = {
  length: 3,
  0: 2,
  1: 3,
  2: 4,
  3: 5, // ignored by forEach() since length is 3
};
Array.prototype.forEach.call(arrayLike, (x) => console.log(x));
// 2
// 3
// 4

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# sec-array.prototype.foreach

Совместимость с браузерами

Настольные компьютеры Мобильные Сервер
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
forEach
1
12
1.5
9.5
3
18
4
10.1
1
1.0
4.4
1
1.0.0
1.0
0.10.0

См. также

  • Polyfill для Array.prototype.forEach в core-js
  • es-shims polyfill для Array.prototype.forEach
  • Руководство по коллекциям с индексами
  • Array
  • Array.prototype.find()
  • Array.prototype.map()
  • Array.prototype.filter()
  • Array.prototype.every()
  • Array.prototype.some()
  • TypedArray.prototype.forEach()
  • Map.prototype.forEach()
  • Set.prototype.forEach()

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API