Mozilla developer包含以下功能填充示例:
[].fill.call({ length: 3 }, 4); // {0: 4, 1: 4, 2: 4, length: 3}
我不明白你需要什么电话()以及如何获得该输出。
答案 0 :(得分:2)
以下是对fill
实现的看法(为了解释)的一瞥:
Array.prototype.fill = function(value) {
for(var i = 0; i < this.length; i++) {
this[i] = value;
}
}
现在,当我们fill.call( { length: 3 }, 4 )
时,我们将对象{ length: 3 }
传递为this
,将4
传递为value
。其余的很明显。
fill
是一个数组函数。为了工作,应该在具有有效length
属性的对象上调用它。 fill
然后从该对象的0
循环到length - 1
,在此对象上设置键值属性,其中key是循环的当前索引(即i
来自上面的伪代码)和值是我们传递给它的value
。
但是使用call
,我们可以传入一个类似数组的对象,而不是传递一个数组,该对象看起来像一个数组(有一个有效的{{1}属性)。 length
被欺骗相信我们称之为的对象是一个数组。对于它来说它和它对真实数组的作用是一样的。
答案 1 :(得分:0)
让我重新编写你的代码
var arr = [1];
arr.fill.call({ length: 3 }, 4); // {0: 4, 1: 4, 2: 4, length: 3}
如果你不使用call
,在上面的代码中,你会看到它返回长度为1的数组
var arr = [1];
arr.fill(4); // {0: 4, length: 1}
您可以看到,使用call
函数可以在另一个数组上执行fill
函数。 call
的第一个参数定义函数作用域(在您的情况下,长度为3的数组),其他参数将传递给函数作为其参数
看看call DOC on MDN