JavaScript Array.prototype.fill:参数

时间:2018-03-05 05:21:10

标签: javascript arrays parameters

MDN上的文档表明Array.prototype.fill的语法是:

Array.prototype.fill(value[, start[, end]])

示例



console.log([1, 2, 3].fill(4, 1, 1));         // [1, 2, 3]




在文档中,我的测试同意评论的答案。

但是,我看不出这是怎么回事。参数表明索引11应填充4。索引1的值为2,因此我的结果应该是[1,4,3]

参数startend的正确解释是什么?

更新

下面接受的答案表明结束指数不包括在内。 MDN上没有提到这一点,但是另一种方法(slice)提到了它。

我冒昧地更新了MDN文章。

3 个答案:

答案 0 :(得分:1)

如果您阅读polyfill代码,则会看到以下代码:

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) {

如你所见,它说while (k < final)。在您的情况下,kfinal都保持相同的值,因此不会发生突变。

如果您将参数更改为不相同,您将看到差异。

&#13;
&#13;
console.log([1, 2, 3].fill(4, 1, 2));
&#13;
&#13;
&#13;

根据skyboyer的建议,ECMA spec

中共享相同的逻辑

skyboyer

也建议
  

[...]。切片(1,1)

什么都不做。但

  

[...]。拼接(1,1)

     

&#34; ...&#34; .substr(1,1)

mutates / return value。这是因为:

  

@skyboyer对于Array.splice,第二个参数不是索引而是计数。对于String.substr,第二个参数是length而不是index。因此两者都工作得很好

参考文献:

答案 1 :(得分:0)

console.log([1, 2, 3].fill(4, 1, 1));

第一个参数4是要填充的值。 第二个参数1是起始索引(从哪里开始)。 第三个参数1是结束索引,它是独占的。

所以,如果你这样做:console.log([1, 2, 3].fill(4, 0, 3));

它将从索引[1,2,3](值0)开始填充1数组,并覆盖所有值,直至索引2,因为我们说{{1}是独家的。

结果将是:3

答案 2 :(得分:0)

简单来说就是

console.log([1, 2, 3].fill(4, 1, 1));  

第二个和thid参数只是在你的情况下通过减法计算的要填充的数组的长度1-1是0所以如果你只想填充你必须使用的第二个,它将不会填充任何东西

console.log([1, 2, 3].fill(4, 1, 2));