【Javascript】关于如何使用循环,看这篇就够了

2024-08-21 10:20
文章标签 java 使用 script 循环 这篇

本文主要是介绍【Javascript】关于如何使用循环,看这篇就够了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

每种编程语言都有循环。循环执行某个操作(也就是一段工作)多次,通常是对数组或列表中的每一项进行操作,或者重复执行直到满足某个条件为止。

JavaScript 尤其提供了多种不同类型的循环。我自己甚至都没有用过所有这些类型,出于好奇心,我想做个高层次的概览。结果发现,至少有几种循环类型没被广泛采用是有充分理由的。

那么,咱们就先用 for 循环开始,花点 while 时间来探索各种不同的循环类型,看看我们能用 each 做些什么,以及为什么你可能会选择一种而非另一种。读到最后你会觉得我这里的小文字游戏绝对逗乐。

whiledo...while 循环

首先登场的是 while 循环。这是最基础的循环类型,在很多情况下也是最容易阅读和最快的。它通常用于做某件事直到满足某个条件。这也是最容易制造无限循环或永不停止的循环的方式。还有 do...while 语句。实际上,唯一的区别在于条件是在每次迭代的末尾而不是开头检查。

// 从数组中移除第一个元素并打印出来,直到数组为空
let queue1 = ["a", "b", "c"];while (queue1.length) {let item = queue1.shift();console.log(item);
}// 上面的相同逻辑,但也会打印数组为空时的信息
let queue2 = [];do {let item = queue2.shift() ?? "empty";console.log(item);
} while (queue2.length);

for 循环

接下来是 for 循环。如果你需要重复执行某个操作一定次数,比如十次,那这就是首选。这种循环对编程新手来说可能有点吓人,但是把相同的循环用 while 风格重写一下,可以帮助理解语法,也更容易记住。

// 打印数字 1 到 5
for (let i = 1; i <= 5; i++) {console.log(i);
}// 同样的事情,但是用 `while` 循环实现
let i = 1; // `for` 循环的第一部分// 第二部分
while (i <= 5) {console.log(i);i++; // 第三部分
}("end");

for...offor await...of 循环

for...of 循环是最简单的方式来遍历数组。

let myList = ["a", "b", "c"];for (let item of myList) {console.log(item);
}

不过它们不仅仅限于数组。技术上讲,它们可以遍历实现了所谓的 可迭代协议 的任何东西。有一些内置类型实现了该协议:数组、映射、集合和字符串,这些是最常见的,但你也可以在自己的代码中实现该协议。做法是在任意对象中添加一个 [Symbol.iterator] 方法,而这个方法应该返回一个迭代器。这有点让人困惑,但大概意思是可迭代的对象是一种特殊的方法,返回迭代器;可以说是迭代器的工厂方法。一种特殊的函数叫做 生成器,它既能返回可迭代对象也能返回迭代器。

let myList = {*[Symbol.iterator]() {yield "a";yield "b";yield "c";},
};for (let item of myList) {console.log(item);
}

上面提到的所有东西都有异步版本:异步可迭代对象、异步迭代器和异步生成器。你可以用 for await...of 来使用异步可迭代对象。

async function delay(ms) {return new Promise((resolve) => {setTimeout(resolve, ms);});
}// 这次我们不是创建一个可迭代对象,而是生成器
async function* aNumberAMinute() {let i = 0;while (true) {// an infinite loopyield i++;// pause a minuteawait delay(60_000);}
}// 它是一个生成器,所以我们需要自己调用它
for await (let i of aNumberAMinute()) {console.log(i);// stop after one hourif (i >= 59) {break;}
}

有一点不太明显的是,你可以用非异步可迭代对象与 for await...of 一起使用,而且完全没问题。然而反过来就不行;你不能用异步可迭代对象与 for...of 一起使用。

forEachmap “循环”

虽然这些严格意义上不算循环,但你可以用它们来遍历列表。

说说 forEach 方法吧。历史上它的速度远不如 for 循环。我认为现在有些情况下这种情况可能已经改变,但如果性能是个问题,我还是会避免使用它。有了 for...of 之后,我不确定还有什么理由要用它。也许唯一的原因是你已经有了一个可以直接作为回调使用的函数,但你也可以很容易地在 for...of 的主体里调用同一个函数。

forEach 还接收每个元素的索引,所以这可能是你需要的功能。最终是否使用它,可能会取决于你正在处理的其他代码是否也在使用它,但如果是新写的代码我个人会尽量避免使用它。

let myList = ["a", "b", "c"];for (let item of myList) {console.log(item);
}// 如果我需要索引,或许可以用 `forEach`
["a", "b", "c"].forEach((item, index) => {console.log(`${index}: ${item}`);
});

同时,map 实质上是将一个数组转换为另一个数组。它与 forEach 一样有性能影响,但它比替代方案更好读一点。当然这是主观判断,就像 forEach 一样,你会希望遵循你的其他代码的做法。在 React 和受 React 启发的库中,你会经常看到它作为遍历数组并在 JSX 中输出项目列表的主要方式。

function MyList({items}) {return (<ul>{items.map((item) => {return <li>{item}</li>;})}</ul>);
}

for...in 循环

说到 JavaScript 中的循环,如果不提 for...in 语句,这个列表就不完整了,因为它可以遍历对象的字段。它还会遍历通过对象原型链继承的字段,这正是我一直避免使用它的原因。

话虽如此,如果你有一个对象字面量,那么 for...in 可能是遍历该对象键的有效方式。值得一提的是,如果你编写 JavaScript 已经有一段时间了,你可能还记得键的顺序曾经在不同浏览器之间不一致,但现在顺序是一致的。任何可能作为数组索引的键(即正整数)都会按升序排列在前面,然后是按声明顺序排列的其他键。

let myObject = {a: 1,b: 2,c: 3,
};for (let k in myObject) {console.log(myObject[k]);
}

结语

循环是许多程序员每天都在使用的东西,尽管我们可能会习以为常,不太去思考它们。

但当你退一步来看我们在 JavaScript 中遍历事物的各种方式时,你会发现其实有很多种方法可以做到这一点。不仅如此,它们之间存在显著——即使细微——的区别,这些差异确实会影响你的编写方式。

这篇关于【Javascript】关于如何使用循环,看这篇就够了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092886

相关文章

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

关于pandas的read_csv方法使用解读

《关于pandas的read_csv方法使用解读》:本文主要介绍关于pandas的read_csv方法使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录pandas的read_csv方法解读read_csv中的参数基本参数通用解析参数空值处理相关参数时间处理相关

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地