javascript - 这个数组初始化速记是如何工作的?
问题描述
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
。
但是value
是undefined
,因为数组还没有初始化。
那么代码如何生成一个数组,其中每个值都等于它的索引,而不是充满NaN
?
解决方案
.call
接受的第一个参数是this
要调用的函数的值。其余参数是调用函数的普通参数。所以这:
Number.call(value, index)
相当于:
Number(index)
其中this
内部的值Number
设置为value
。
确实是未定义的value
,但 Number 构造函数并不关心它的调用上下文,它的this
,所以它实际上被忽略并从索引创建一个数字。
这是另一种看待它的方式:下面是一个名为 的函数foo
,它在.call
ed 时不关心第一个参数,而只考虑第二个参数:
function foo(arg) {
return 'foo' + arg;
}
console.log(
foo.call('IGNORED PARAMETER', 'bar')
);
推荐阅读
- xcode - 在 Xcode 日志中,'[number1:number2]' 是什么意思?
- python-3.x - PermissionError: [Errno13] 权限被拒绝
- automation - 如何在 JMeter 中添加响应和请求正文到邮件?
- reactjs - React 甚至设置了静态 defaultProps,但是报错为什么?
- python - UnicodeDecodeError:“ascii”编解码器无法解码位置 8 中的字节 0xc3:序数不在范围内(128)
- sql-server - Logstash 到 SQL Server 连接失败
- php - 滑块未以正确格式显示
- python - 如果日期时间缺少一分钟或更长时间的条目,则无法重新采样
- mysql - 两个表的where子句中的count()
- reactjs - 嵌套开关可以使用换页动画吗?