Array.prototype.fill()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.

Метод fill() заполняет все элементы массива от начального до конечного индексов одним значением.

Интерактивный пример

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

// Fill with 0 from position 2 until position 4
console.log(array1.fill(0, 2, 4));
// Expected output: Array [1, 2, 0, 0]

// Fill with 5 from position 1
console.log(array1.fill(5, 1));
// Expected output: Array [1, 5, 5, 5]

console.log(array1.fill(6));
// Expected output: Array [6, 6, 6, 6]

Синтаксис

arr.fill(value[, start = 0[, end = this.length]])

Параметры

value

Значение, заполняющее массив.

start

Необязательный параметр. Начальный индекс.

end

Необязательный параметр. Конечный индекс.

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

Изменённый массив.

Описание

Элементы заполняются в полузакрытом интервале [start, end).

Метод fill принимает до трёх аргументов — value, start и end. Аргументы start и end являются необязательными со значениями по умолчанию, равными 0 и length объекта this соответственно.

Если аргумент start является отрицательным, он трактуется как length+start, где length — это длина массива. Если аргумент end является отрицательным, он трактуется как length+end.

Метод fill намеренно является обобщённым, он не требует, чтобы значение this внутри него было объектом Array.

Метод fill является изменяющим методом, он изменит объект this и вернёт его, а не просто вернёт копию.

Если аргумент value является объектом, то метод fill заполнит массив ссылками на этот объект.

Примеры

[1, 2, 3].fill(4);               // [4, 4, 4]
[1, 2, 3].fill(4, 1);            // [1, 4, 4]
[1, 2, 3].fill(4, 1, 2);         // [1, 4, 3]
[1, 2, 3].fill(4, 1, 1);         // [1, 2, 3]
[1, 2, 3].fill(4, 3, 3);         // [1, 2, 3]
[1, 2, 3].fill(4, -3, -2);       // [4, 2, 3]
[1, 2, 3].fill(4, NaN, NaN);     // [1, 2, 3]
[1, 2, 3].fill(4, 3, 5);         // [1, 2, 3]
Array(3).fill(4);                // [4, 4, 4]
[].fill.call({ length: 3 }, 4);  // {0: 4, 1: 4, 2: 4, length: 3}

// Объекты заполняются по ссылке.
var arr = Array(3).fill({}) // [{}, {}, {}];
arr[0].hi = "hi"; // [{ hi: "hi" }, { hi: "hi" }, { hi: "hi" }]

Полифил

if (!Array.prototype.fill) {
  Object.defineProperty(Array.prototype, 'fill', {
    value: function(value) {

      // Шаги 1-2.
      if (this == null) {
        throw new TypeError('this is null or not defined');
      }

      var O = Object(this);

      // Шаги 3-5.
      var len = O.length >>> 0;

      // Шаги 6-7.
      var start = arguments[1];
      var relativeStart = start >> 0;

      // Шаг 8.
      var k = relativeStart < 0 ?
        Math.max(len + relativeStart, 0) :
        Math.min(relativeStart, len);

      // Шаги 9-10.
      var end = arguments[2];
      var relativeEnd = end === undefined ?
        len : end >> 0;

      // Шаг 11.
      var final = relativeEnd < 0 ?
        Math.max(len + relativeEnd, 0) :
        Math.min(relativeEnd, len);

      // Шаг 12.
      while (k < final) {
        O[k] = value;
        k++;
      }

      // Шаг 13.
      return O;
    }
  });
}

Если вам нужно поддерживать действительно устаревшие движки JavaScript, которые не поддерживают Object.defineProperty, то лучше вообще не использовать полифилы для методов Array.prototype, так как вы не можете сделать их не перечисляемыми.

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

Specification
ECMAScript® 2025 Language Specification
# sec-array.prototype.fill

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

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
fill

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

Смотрите также