Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用扩展语法创建一系列自然数_Javascript_Arrays_Ecmascript 6_Iterator - Fatal编程技术网

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

Javascript 使用扩展语法创建一系列自然数,javascript,arrays,ecmascript-6,iterator,Javascript,Arrays,Ecmascript 6,Iterator,一方面,在ES6中,缺少与Python3的范围相当的代码是一个麻烦。另一方面,有很多变通办法。我的问题是,为什么我尝试的一种解决方法确实有效。举例说明: [...Array(10).keys()]; 如果我发现这个神秘的原因不明显,请注意Array(10).keys()至少看起来是空的 我知道这会浪费时间创建两个数组,就像大多数流行的解决方法一样,而且(以创建生成器函数为代价)使用生成器可以避免这种情况。例如: [...(function*(){let i = 0; while(i<10

一方面,在ES6中,缺少与Python3的
范围
相当的代码是一个麻烦。另一方面,有很多变通办法。我的问题是,为什么我尝试的一种解决方法确实有效。举例说明:

[...Array(10).keys()];
如果我发现这个神秘的原因不明显,请注意
Array(10).keys()
至少看起来是空的

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

[...(function*(){let i = 0; while(i<10) yield i++;})()];
[…(function*(){let i=0;while(i返回一个
数组
迭代器。然后扩展语法通过访问迭代器中的下一个值来完全耗尽迭代器,直到没有更多值。然后它从迭代器收集所有值,并将它们扩展到一个新数组中

创建一个没有任何实际整数索引键的数组,但只有一个
length
属性——因此它将“空”但
数组(10).keys()
不是。事实是使用
Array#keys
。内部操作通过内在函数创建迭代器,从而从数组中创建键迭代器。查看,您将看到使用了数组的长度。对于
Array#keys
,索引不断递增,直到达到数组的长度。这就是方法迭代器被创建,它将为您提供数组的所有键,而实际上没有所述的整数键


如果您对抽象步骤感兴趣,请参阅ECMAScript语言规范,特别是
SpreadElement:…AssignmentExpression
产品,它概述了通过与spread语法一起使用的迭代器的过程

要查看将这些值收集到新数组中的抽象步骤,请参见。具体来说,
ArrayLiteral:[ElementList]
production就是production
[…array.keys()]
属于。执行上述数组累积过程,通过迭代器聚合迭代并将其设置为新数组。

数组(10)
创建一个长度为10的数组,其中每个元素都
未定义

Array(10).keys()
返回一个迭代器,该迭代器在数组的键上进行迭代…数字
0
9

当使用扩展语法定义数组文字()时,它会完全迭代给定的任何迭代器,并将迭代器返回的结果(按顺序)添加到创建的数组中。

将返回一个新的数组迭代器。
Array(10)
是一个包含10个(空的)插槽的数组

当您分散数组的键时,您正在对其进行迭代并创建一个新数组。但这次新数组的项是第一个数组中的插槽

您可以通过
for of
循环查看它:

const arr=Array(10).keys();
for(让arr的键){
控制台日志(键);

}
.keys()
确实返回迭代器。它不是数组,也不是“显然是空的”。@Bergi看看它。就像一些答案一样,你似乎误解了
数组(10)
生成的内容(或者我误解了你的答案。)@Alan而
数组(10)
确实是空的(不仅仅是表面上),
Array(10)。keys()
不是-它不是数组。@Bergi当然。这就是问题的基础:为什么keys在空数组上迭代生成与长度对应的键?(即,规范如何引导我们预期这种行为?)这是:“其中的每个元素都未定义”实际上不是这样。它创建了一个有10个空槽的数组。不是
未定义的
我不明白您在这里所做的区别;您能说得更多吗?数组中的每个位置都是一个有效的引用,返回
未定义的
作为其值。看起来它们与已声明但未赋值的变量处于相同的状态d、 首先,它在“空槽”中是这样说的。至于返回的
未定义的
,你可以在任何索引位置得到它:
数组(10)[99]==未定义的
。实际上不是任何位置,范围在你说的0到232-1(包括)之间“通过内部
%ArrayIteratorPrototype%
对象创建迭代器,从数组中为迭代器设置关键帧。查看
%ArrayIteratorPrototype%.next()
,您将看到使用了数组的
长度
。”这与我的推测相符,并回答了我的问题。谢谢!