首页 > 解决方案 > 这个数组初始化速记是如何工作的?

问题描述

console.log(
  Array.from({ length: 3 }, Function.call, Number)
);

根据我的理解,上面的代码传递(value, index)给原型的.call方法。Function

并且 的this.call设置为Number

所以它与以下内容完全相同:

Array.from({ length: 3 }, (value, index) => Number.call(value, index))

在 VSCode 中,我的工具提示将函数描述为:

mapfn: (v: any, k: number) => any

这就是我从那里得到(value, index)的,假设k意味着key/ index

Number只接受一个数字参数。所以它会接受value,而忽略index

但是valueundefined,因为数组还没有初始化。

那么代码如何生成一个数组,其中每个值都等于它的索引,而不是充满NaN

标签: javascriptarrays

解决方案


.call接受的第一个参数是this要调用的函数的值。其余参数是调用函数的普通参数。所以这:

Number.call(value, index)

相当于:

Number(index)

其中this内部的值Number设置为value

确实是未定义的value,但 Number 构造函数并不关心它的调用上下文,它的this,所以它实际上被忽略并从索引创建一个数字。

这是另一种看待它的方式:下面是一个名为 的函数foo,它在.called 时不关心第一个参数,而只考虑第二个参数:

function foo(arg) {
  return 'foo' + arg;
}

console.log(
  foo.call('IGNORED PARAMETER', 'bar')
);


推荐阅读