非常教程

JavaScript参考手册

排列 | Array

array.fill

fill() 方法用一个固定值填充一个数组中从起始索引到终止索引内的全部元素。

var numbers = [1, 2, 3]
numbers.fill(1);

// results in [1, 1, 1]

语法

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

参数

value用来填充数组元素的值。

start可选起始索引,默认值为0。

end可选终止索引,默认值为this.length

返回值

修改后的数组。

描述

具体要填充的元素区间是 [start,end) 。

fill方法接受三个参数 value,start以及end.startend参数是可选的, 其默认值分别为 0 和this对象的 length 属性值.

如果 start 是个负数, 则开始索引会被自动计算成为 length+start, 其中length 是 this 对象的 length 属性值. 如果end 是个负数, 则结束索引会被自动计算成为 length+end.

fill 方法故意被设计成通用方法,也就是说它不需要this值必须是个数组对象。

fill 方法是个可变方法, 它会改变调用它的this对象本身, 然后返回它, 而并不是返回一个副本.

示例

[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, -2);       // [4, 2, 3]
[1, 2, 3].fill(4, NaN, NaN);     // [1, 2, 3]
Array(3).fill(4);                // [4, 4, 4]
[].fill.call({ length: 3 }, 4);  // {0: 4, 1: 4, 2: 4, length: 3}

Polyfill

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

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

      var O = Object(this);

      // Steps 3-5.
      var len = O.length >>> 0;

      // Steps 6-7.
      var start = arguments[1];
      var relativeStart = start >> 0;

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

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

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

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

      // Step 13.
      return O;
    }
  });
}

如果你确实需要维护已过时的不支持 Object.defineProperty 的 JavaScript 引擎,那么最好完全不向 Array.prototype 添加方法,因为你不能使它不可枚举。

规范

Specification

Status

Comment

ECMAScript 2015 (6th Edition, ECMA-262)The definition of 'Array.prototype.fill' in that specification.

Standard

Initial definition.

ECMAScript Latest Draft (ECMA-262)The definition of 'Array.prototype.fill' in that specification.

Living Standard

浏览器兼容性

Feature

Chrome

Edge

Firefox

Internet Explorer

Opera

Safari

Basic Support

45

(Yes)

31

未实现

(Yes)

7.1

Feature

Android

Chrome for Android

Edge mobile

Firefox for Android

IE mobile

Opera Android

iOS Safari

Basic Support

(Yes)

(Yes)

(Yes)

31

未实现

(Yes)

8

JavaScript

JavaScript 是一种高级编程语言,通过解释执行,是一门动态类型,面向对象(基于原型)的解释型语言。它已经由ECMA(欧洲电脑制造商协会)通过 ECMAScript 实现语言的标准化。它被世界上的绝大多数网站所使用,也被世界主流浏览器( Chrome、IE、FireFox、Safari、Opera )支持。JavaScript 是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持 I/O,比如网络