JavaScript Array.prototype.fill:参数的含义

问题描述 投票:1回答:3

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

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

这个例子

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

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

但是,我看不出这是怎么回事。参数表明通过1的索引1应填充4。索引1具有2的值,所以我应该有结果应该是[1,4,3]

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

更新

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

我冒昧地更新了MDN文章。

javascript arrays parameters
3个回答
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的索引,因为我们说3是独占的。

结果将是:[4, 4, 4]


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都具有相同的值,因此不会发生突变。


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

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

正如skyboyer所建议的那样,ECMA spec也有同样的逻辑

skyboyer也建议,

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

什么都不做但

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

“......”。substr(1,1)

变异/返回值。这是因为:

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


References:


0
投票

简单来说

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

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

console.log([1, 2, 3].fill(4, 1, 2)); 
© www.soinside.com 2019 - 2024. All rights reserved.