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]
。
什么是start
和end
参数的正确解释?
更新
下面接受的答案表明结束指数不包括在内。 MDN上没有提到这一点,尽管有另一种方法(slice
)。
我冒昧地更新了MDN文章。
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]
如果您阅读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)
。在您的情况下,k
和final
都具有相同的值,因此不会发生突变。
如果将参数更改为不相同,您将看到差异。
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。因此两者都很好
简单来说
console.log([1, 2, 3].fill(4, 1, 1));
第二个和thid参数只是在你的情况下通过减法计算的要填充的数组的长度1-1是0所以如果你只想填充你必须使用的第二个,它将不会填充任何东西
console.log([1, 2, 3].fill(4, 1, 2));