使用扩展语法创建一系列自然数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用扩展语法创建一系列自然数相关的知识,希望对你有一定的参考价值。

一方面,缺乏与Python 3的range相当的东西是ES6的烦恼。另一方面,有很多变通方法。我的问题是为什么我试过的一种解决方法实际上有效。为了显示:

[...Array(10).keys()];

如果我发现这个神秘的原因并不明显,请注意Array(10).keys()至少显然是空的。

我知道这会浪费地创建两个数组,就像大多数流行的解决方法一样,而且(以创建生成器函数为代价)使用生成器可以避免这种情况。例如。,

[...(function*(){let i = 0; while(i<10) yield i++;})()];

我的问题只是为什么第一个解决方法产生了预期的结果。

编辑:

从答案来看,有些人认为Array(10)的评价等同于对Array.apply(null,Array(10))的评价。他们不是。例如,.hasOwnProperty(0)是前者的false,后者是true。但是,我很乐意被说服他们在某些方面与此相同,因为我的理解显然缺乏某些关键点。我怀疑答案是迭代密钥的结果是由length属性确定的,它们共享,而不是已经定义的实际数组索引。如果是这样,我想知道这种行为是规范性的。

答案

Array#keys返回一个Array迭代器。然后,通过访问迭代器中的下一个值,直到没有更多值,Spread语法完全耗尽了迭代器。然后它从迭代器中收集所有值并将它们传播到一个新数组中。

Array(10)创建了一个array exotic object,它没有任何实际的整数索引键,但只是一个length属性 - 所以它会'空'但Array(10).keys()不是。事实是使用Array#keys doesn't depend on actual elements, just the length property。内部操作CreateArrayIterator通过内部%ArrayIteratorPrototype% object创建迭代器,从数组创建一个关键迭代器。看看%ArrayIteratorPrototype%.next(),你会看到使用数组的长度。对于Array#keys,索引会不断递增,直到达到数组的长度。这就是迭代器的创建方式,它为您提供了数组的所有键,而不是首先实际拥有所述整数键。


如果您对抽象步骤感到好奇,请参阅ECMAScript语言规范的Section 12.2.5.2 ArrayAcculumation,特别是SpreadElement : ... AssignmentExpression生成,其中概述了逐步通过与扩展语法结合使用的迭代器的过程。

要查看将这些值收集到新数组中的抽象步骤,请参阅Section 12.2.5.3 Evaluation。具体来说,ArrayLiteral : [ ElementList ]生产是生产[...Array.keys()]属于。执行前面提到的ArrayAcculumation过程,该过程通过迭代器聚合迭代并将它们设置为新数组。

另一答案

Array.prototype.keys正在返回一个新的Array Iterator。 Array(10)是一个包含10个(空)插槽的数组。

当您展开数组的键时,您将迭代它并创建一个新数组。但这次新数组的项目是第一个数组的插槽。

你可以用for of循环看到它:

const arr = Array(10).keys();
for (let key of arr) {
  console.log(key);
}
另一答案

Array(10)创建了一个长度为10的数组,其中每个元素都是undefined

Array(10).keys()返回一个迭代器,它迭代数组的键...数字09

当扩展语法用于定义数组文字(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator)时,它会完全迭代它给定的任何迭代器,并将迭代器的返回值添加到创建的数组中(按顺序)。

以上是关于使用扩展语法创建一系列自然数的主要内容,如果未能解决你的问题,请参考以下文章

Terraform:尝试使用列表创建一系列子网 cidr,但出现错误“需要字符串”

mysql:在w3schools文档上学习sql语法(使用数据库创建一张表)

如何通过迭代方法创建一系列带有统计注释的箱线图

从viewPager片段(Kotlin)中获取用户输入信息

如何在不满足给定条件的情况下创建一系列变量并将它们存储在列表中?

用 GitBook 创建一本书