Array.prototype.fill()

Метод fill() заповнює (змінює) всі елементи масиву з початкового індексу (за замовчуванням нуль) до кінцевого індексу (за замовчуванням довжина масиву) статичним значенням. Метод повертає змінений масив.

Синтаксис

arr.fill(value[, start[, end]])

Параметри

value
Величина, якою потрібно заповнити масив.
start Optional
Початковий індекс, за замовчуванням 0.
end Optional
Кінцевий індекс, за замовчуванням this.length.

Значення, яке повертається

Змінений масив.

Опис

Метод fill приймає три аргументи: value, start та end. Аргументи start та end є необов'язковими й за замовчуванням дорівнюють 0 та значенню length об'єкта this.

Якщо значення start є від'ємним, воно сприймається як length+start, де length - це довжина масиву. Якщо значення end є від'ємним, воно сприймається як length+end.

Метод fill є навмисно загальним, він не вимагає, щоб значенням this був об'єкт Array.

fill є методом модифікації, він змінить сам об'єкт this та поверне його, а не просто його копію.

Коли у 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: "привіт" }]

Поліфіл

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, оскільки ви не зможете зробити їх не перелічуваними.

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

Специфікація Статус Коментар
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Array.prototype.fill' in that specification.
Standard Початкове визначення.
ECMAScript (ECMA-262)
The definition of 'Array.prototype.fill' in that specification.
Living Standard

Сумісність з веб-переглядачами

BCD tables only load in the browser

Див. також