我在网上找到了这段代码,它很有效;然而,我不知道怎么做!

谁能解释一下这个代码是怎么工作的吗?

const arr_seq = Array.apply(null, {
  length: 10
}).map(Number.call, Number);

console.log(arr_seq)

输出为:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

还有,有人能解释一下为什么我认为这段代码可能会做完全相同的事情,而不是创建一个充满undefined的数组吗?

const arr_undef = Array(n).map(Number.call, Number);

推荐答案

Array.apply的第二个参数需要一个数组(-like)值.然后,它将为这个类似数组的对象中的每个插槽创建一个参数.

由于此代码将{ length: 5 }作为参数传递,apply方法将使用5个值调用Array.但是当在0范围内为i读取{ length: 5 }[i]时..4.undefined.所以Array.apply(null, { length: 5 })将转化为Array(undefined, undefined, undefined, undefined, undefined).

然后,.map调用有第二个参数,即thisArg参数.这确保不仅调用call,而且调用Number.call,即使用正确的this设置.对于Number.call,第一个参数将接收这undefined个值(在上一段中解释),并作为second个参数,映射的索引.所以我们接到这些电话:

Number.call(undefined, 0)
Number.call(undefined, 1)
Number.call(undefined, 2)
Number.call(undefined, 3)
Number.call(undefined, 4)

这与以下结果相同:

Number(0)
Number(1)
Number(2)
Number(3)
Number(4)

.map将返回一个包含这些值的array.

更新的方法

自ECMAScript 2015以来,JavaScript拥有Array.keys()种数组文字的扩展语法.因此,我们现在可以以一种不那么神秘的方式实现同样的目标:

console.log([...Array(5).keys()]);

Javascript相关问答推荐

使用NgDeliverentOutlet和动态内容投影的Angular 渲染组件

JavaScript .Click()函数不起作用

除了在Angular 16中使用快照之外,什么是可行且更灵活的替代方案?

单击按钮后未清除 Select

从外部访问组件变量-Vueejs

我试图实现用户验证的reduxstore 和操作中出了什么问题?

IMDB使用 puppeteer 加载更多按钮(nodejs)

为什么我的includes声明需要整个字符串?

将状态向下传递给映射的子元素

Chrome是否忽略WebAuthentication userVerification设置?""

显示图—如何在图例项上添加删除线效果?

还原器未正确更新状态

类构造函数忽略Reaction Native中的可选字段,但在浏览器中按预期工作

当用户点击保存按钮时,如何实现任务的更改?

钛中的onClick事件需要在两次点击之间等待几秒钟

如何 for each 输入动态设置输入变更值

Vaadin定制组件-保持对javascrip变量的访问

在VS代码上一次设置多个变量格式

使用类型:assets资源 /资源&时,webpack的配置对象&无效

JavaScript将字符串数字转换为整数