繁体   English   中英

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

[英]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]

在文档中,我的测试与评论的答案一致。

但是,我看不出这怎么可能是对的。 参数指示索引11应填充4 索引1的值为2 ,所以我应该有结果应该是[1,4,3]

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

更新

下面接受的答案指出结束索引不包括在内。 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) 在您的情况下, kfinal具有相同的值,因此不会进行任何更改。


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

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM