for/of

ES6添加了一个新的循环语句:for/of

for/of本质是对可迭代对象进行迭代操作
例:
for(let element of data){
    // data.push(sum)  // 这样会创造一个无穷的循环,因为迭代永远不能触及最后一个数组
    sum += element
}
若对象不可迭代,则抛出TypeError
for(let element of o){
    console.log(element) // TypeError: o is not iterable
}
若想迭代对象的属性,应使用for/in,或使用Object.keys()/values()/entries()
for(let k of Object.keys(o)){
    console.log(k)   // 注意:在循环体内修改对象向不会影响迭代的进行
}
字符串是可迭代的
let frequency = {}
for(let i of "mississippi"){
    if(frequency[i]) frequency[i]++
    else frequency[i] = 1
}
console.log(frequency)  // { m: 1, i: 4, s: 4, p: 2 }
Set(集合)与Map(映射)是可迭代的
复制代码
let newSet = new Set([1, 2, 3, 4, 5, 6])
for(let i of newSet){
    console.log(i)  // 1 2 3 4 5 6
}

let newMap = new Map([["a", 1], ["b", 2], ["c", 3]])
for(let i of newMap){
    console.log(i)  // [ 'a', 1 ] [ 'b', 2 ] [ 'c', 3 ]
}
复制代码

for/await/of ES2018新增了异步迭代器

从异步可迭代流中读取数据块并打印
async function printStream(stream){
    for await (let i of stream){
        console.log(i);
    }
}

那么这时有一个问题,for/of,for/in,forEach和普通for循环四种for循环,执行异步请求是什么情况呢?

话不多说,上代码:

下述代码执行结果,for/in,for/of和普通for循环都成功阻塞了进程,唯独forEach没有阻塞成功

复制代码
    let promiseTask = (num) => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log(num * num);
                resolve(true);
            }, 1000);
        })
    }

    const task = [1, 2, 3];

    async function DoTaskByForEach() {
        await task.forEach((g) => {
            promiseTask(g);
        });
    }

    // DoTaskByForEach(); // 并发执行

    async function DoTaskByForLength() {
        for (let i = 0; i < task.length; i++) {
            await promiseTask(task[i]);
        }
    }

    // DoTaskByForLength(); // 按顺序执行

    async function DoTaskByForOf() {
        for (let item of task) {
            await promiseTask(item);
        }
    }

    DoTaskByForOf(); // 按顺序执行
    async function DoTaskByForIn() {
        for (item in task) {
            await promiseTask(item);
        }
    }

    DoTaskByForIn(); // 按顺序执行
 
复制代码

 

 

posted @   邢韬  阅读(56)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
历史上的今天:
2018-12-06 范型
点击右上角即可分享
微信分享提示