[英]JavaScript Array.prototype.fill: meaning of parameters
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 文章。
如果您阅读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规范中共享相同的逻辑
也由skyboyer推荐,
[...].slice(1, 1)
什么都不做。 但
[...].拼接(1,1)
"...".substr(1, 1)
变异/返回值。 这是因为:
@skyboyer 对于 Array.splice,第二个参数不是索引而是计数。 对于 String.substr 第二个参数是长度而不是索引。 因此两者都工作得很好
console.log([1, 2, 3].fill(4, 1, 1));
第一个参数4
是要填充的值。 第二个参数1
是起始索引(从哪里开始)。 第三个参数1
是唯一的结束索引。
所以如果你这样做: console.log([1, 2, 3].fill(4, 0, 3));
它将从索引0
(值1
)开始填充[1,2,3]
数组并覆盖索引2
所有值,因为我们说3
是独占的。
所以结果将是: [4, 4, 4]
简单来说
console.log([1, 2, 3].fill(4, 1, 1));
second 和thid 参数只不过是要填充的数组的长度,在您的情况1-1 中是通过减法计算的,因此如果您只想填充必须使用的第二个,它将不会填充任何东西
console.log([1, 2, 3].fill(4, 1, 2));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.