Learn JavaScript

fill() - метод для заполнения массива значением в JavaScript

fill() заполняет массив одним и тем же значением.

Это удобный метод, когда нужно быстро записать одинаковое значение во все элементы массива или только в его часть.

Синтаксис

array.fill(value)
array.fill(value, start)
array.fill(value, start, end)

value - значение, которым нужно заполнить массив.

start - индекс, с которого начинается заполнение.

end - индекс, до которого идёт заполнение, но сам end не включается.

Что делает fill()

Метод проходит по массиву и записывает одно и то же значение в нужные позиции.

const numbers = [1, 2, 3];

numbers.fill(0);

console.log(numbers); // [0, 0, 0]

fill() меняет исходный массив

fill() работает прямо с исходным массивом, а не создаёт новый.

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

items.fill("x");

console.log(items); // ["x", "x", "x"]

Это главное, что важно запомнить про метод.

Что возвращает fill()

fill() возвращает сам изменённый массив.

const numbers = [1, 2, 3];
const result = numbers.fill(9);

console.log(result);  // [9, 9, 9]
console.log(numbers); // [9, 9, 9]

Но это не новый массив, а тот же самый.

Заполнение части массива

Можно заполнить не весь массив, а только нужный диапазон.

const numbers = [1, 2, 3, 4, 5];

numbers.fill(0, 1, 4);

console.log(numbers); // [1, 0, 0, 0, 5]

Здесь заполнение началось с индекса 1 и остановилось перед индексом 4.

Если передать только start

Если указать только start, заполнение пойдёт от этой позиции до конца массива.

const numbers = [1, 2, 3, 4];

numbers.fill(7, 2);

console.log(numbers); // [1, 2, 7, 7]

Отрицательные индексы

fill() поддерживает отрицательные индексы.

В этом случае отсчёт идёт с конца массива.

const numbers = [1, 2, 3, 4, 5];

numbers.fill(0, -2);

console.log(numbers); // [1, 2, 3, 0, 0]

Можно использовать и отрицательный end:

const numbers = [1, 2, 3, 4, 5];

numbers.fill(8, 1, -1);

console.log(numbers); // [1, 8, 8, 8, 5]

fill() и Array()

Очень частый сценарий - создать массив нужной длины и сразу заполнить его значением.

const numbers = Array(3).fill(0);

console.log(numbers); // [0, 0, 0]

Это полезно, потому что Array(3) сам по себе создаёт массив с пустыми слотами.

Осторожно с объектами

Если передать в fill() объект, этот же объект будет записан во все позиции массива.

const users = Array(3).fill({ name: "Anna" });

console.log(users);
// [{ name: "Anna" }, { name: "Anna" }, { name: "Anna" }]

На вид всё нормально, но внутри это одна и та же ссылка.

const users = Array(3).fill({ name: "Anna" });

users[0].name = "Ivan";

console.log(users);
// [{ name: "Ivan" }, { name: "Ivan" }, { name: "Ivan" }]

Это одна из самых частых ловушек с fill().

Если нужны разные объекты, обычно используют Array.from():

const users = Array.from({ length: 3 }, () => ({ name: "Anna" }));

Когда это полезно

fill() удобно использовать, когда:

  • нужно быстро заполнить массив одинаковым значением
  • нужно перезаписать часть массива
  • нужно создать массив с начальными значениями
  • изменение исходного массива допустимо

Частые ошибки

Думать, что fill() создаёт новый массив

const numbers = [1, 2, 3];

numbers.fill(0);

console.log(numbers); // [0, 0, 0]

Метод меняет исходный массив.

Считать, что end включается

const numbers = [1, 2, 3, 4];

numbers.fill(9, 1, 3);

console.log(numbers); // [1, 9, 9, 4]

Элемент с индексом 3 уже не заполняется.

Заполнять массив объектом и ждать разные объекты

const items = Array(2).fill({ value: 0 });

В обеих ячейках будет ссылка на один и тот же объект.

Быстрая памятка

  • fill() заполняет массив одним значением
  • метод меняет исходный массив
  • end не включается в диапазон
  • fill() поддерживает отрицательные индексы
  • с объектами внутри метод записывает одну и ту же ссылку

Коротко

fill() - это удобный способ быстро заполнить массив одинаковым значением. Главное, что стоит запомнить: метод изменяет исходный массив, а при работе с объектами во все позиции попадает одна и та же ссылка.