方法一:[...(new Array(n)).keys()];
方法二:Array.from({length:n},(v, k) => k);
方法三:(Array.from({length:n})).map((v,k) => k)
new Array(n)通过构造函数 Array 实例化一个长度为n 的数组 // [
keys() 方法用于从数组创建一个包含数组键的可迭代对象。
在ES6中有3种类型的集合对象:数组、Map集合与Set集合,为了更好地访问对象中的内容,这3种对象都内建了以下三种迭代器:
entries() 返回一个迭代器,其值为多个键值对
values() 返回一个迭代器,其值为集合的值
keys() 返回一个迭代器,其值为集合中的所有键名
let data = (new Array(3)).keys()
for (let key of data) {
console.log(key) // 依次打印0 1 2
}
迭代器(interator):迭代器是一种特殊对象,它具有一些专门为迭代过程设计的专有接口,所有的迭代器对象都有一个next()方法,每次调用都返回一个结果对象。结果对象有两个属性:一个是value,表示下一个将要返回的值;另一个是done,它是一个布尔类型的值,当没有更多可返回数据时返回true。迭代器还会保存一个内部指针,用来指向当前集合中值的位置,每调用一次next()方法,都会返回下一个可用的值
let data = new Array(3).keys()
console.log(data.next().value) // 0
console.log(data.next().value) // 1
console.log(data.next().value) // 2
console.log(data.next().value) // undefined
...展开运算符:用途:将一个数组转为用逗号分隔的参数序列、将具有迭代器(Iterator)接口的对象,转换成数组([...可迭代对象])等
let array1 = [0,1,2,3]
let array2 = [5,6,7,...array1] // [5,6,7,0,1,2,3]
在数组中使用展开运算符,可以将可迭代对象中的多个元素依次插入新数组中,替换原先展开运算符所在的位置
(new Array(n)).keys() 是一个具有迭代器(Iterator)接口的对象(上文有解释keys()返回可迭代对象),[...(new Array(n)).keys()]将可迭代对象转换为数组
Array.from()方法将一个类数组对象或者可遍历对象转换成一个真正的数组。
Array.from (obj, mapFn): obj指的是数组对象、类似数组对象或者是set对象,mapFn指的是对数组中的元素进行处理的方法。
{length:n}: 长度为n 的类数组对象
mapFn: 传入的参数为obj对象的 value,key
(v,k)=> k:传入参数 v(值),k(键) 返回值为k,等价于
function(v,k){
return k
}
Array.from({length:n}): 创建长度为n 的数组
map()方法:将原数组映射成一个新的数组;
map方法接受一个新参数,这个参数就是将原数组变成新数组的映射关系。
(v,k) => k: 传入参数v(值),k(序号), 返回k