继for循环,和forEach方法迭代数组后,要想迭代数组的值还可以用for...of循环
使用:
// for...of循环示例 let array = [1, 2, 3] for (let key of array) { console.log(key); } /* 输出: 1 2 3 */
可以看到:使用for...of循环迭代整个数组还是比较方便,方便取到值并且使用,示例所示并非仅可以迭代数组,更多可参见for...of详细指南 但是有一个问题是:
怎么拿到当前项的下标(索引)?
直接多给个参数?不行,key的位置只能容得下一个参数,装不下其他参数了;
有问题自然是有对应解决措施
1、array.keys()
:
方法返回一个包含数组中每个索引键的 Array Iterator 对象
let array = [10, 20, 30] for (let key of array.keys()) { console.log(key); } /* 输出: 0 1 2 */
感受:确实是获取到了下标,但就一个下标让人有点难办,或是有什么妙用,亟待探索
更多关于数组中keys防范介绍
2、array.entries()
:
返回一个新的数组迭代器对象,该对象包含数组中每个索引的键/值对
let array = [10, 20, 30] for (let key of array.entries()) { console.log(key); } /* 输出: [ 0, 10 ] [ 1, 20 ] [ 2, 30 ] */
感受:for循环表示我上我也行,直接就
确实,遍历上面示例类似的数组还是站在for循环这边的,因为这里我想到一个问题:
再看以下描述:entries()
返回一个新的数组迭代器对象,该对象包含数组中每个索引的键/值对
这是不是意味着需要先对array
迭代一遍,事先处理好数据(一维数组-->二维数组)得到一个新的数组,然后都这个新的数组进行迭代,最终得到示例的结果
也就是说:
for循环:迭代一遍数组,可以同时的带下标和值
for..of+entries():共迭代两遍数组,同时生成了一个新的数组
后者的时间复杂度系数相对前者来说翻了一倍,但指数未变化,然后按照复杂度分析可以忽略系数的影响,一倍的系数变化近似于没有变化,所以问题不是很大(以上分析纯属个人看法,出问题概不负责)
更多关于数组entries的介绍
3、辅助变量获取索引:
外部创建一个变量,类似于i=0
,每次迭代递增,这也是下意识想到的解决办法,谈不上优雅,仅作为一种方法而存在
let i = 0; let array = [10, 20, 30] for (let key of array) { console.log(i, key); i++; } /* 输出: 0 10 1 20 2 30 */