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 Latest Draft (ECMA-262)
The definition of 'Array.prototype.fill' in that specification.
Draft

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

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
fillChrome Full support 45Edge Full support 12Firefox Full support 31IE No support NoOpera Full support YesSafari Full support 8WebView Android Full support YesChrome Android Full support YesFirefox Android Full support 31Opera Android Full support YesSafari iOS Full support 8Samsung Internet Android Full support Yesnodejs Full support 4.0.0
Full support 4.0.0
Full support 0.12
Disabled
Disabled From version 0.12: this feature is behind the --harmony runtime flag.

Legend

Full support  
Full support
No support  
No support
User must explicitly enable this feature.
User must explicitly enable this feature.

Див. також