HELLO,这里是大熊的前端开发笔记。

循环作为 算法与数据结构 中的基石,JS 与其他编程语言一样,都提供了多种循环结构用于处理数据。

for 循环

事物的开端往往都是从最常用的开始,循环结构咱们从 for 循环说起。

语法:

for (初始化; 条件; 增量) {
// ...
}

示例:

// 增量每次 +1
for (let i = 0; i < 10; i++) {
console.log(i);
}
// 增量每次 +2
for (let i = 0; i < 10; i += 2) {
console.log(i);
}

性能优化:

在使用 for 循环遍历数组的时候,可以提前缓存数组长度,减少 length 的访问次数。

const arr = ['前', '端', '路', '引'];
// 提前使用 len 缓存数组长度
for (let i = 0, len = arr.length; i < len; i++) {
console.log(arr[i]);
}

此示例中使用了 let 同时声明了多个变量,在常规的代码编写中,不建议这么使用,但在循环体这种特殊情况下,这么写也能接受。

// 同时声明多个变量
let a = '前端路引', b = 2, c = true;

增量不一定要使用 i++ 自增,也可以使用 i-- 递减,或者使用 i += 2 步进,甚至可以是 i += 10

for in 循环

ES6 规范出现之前,只能使用 for in 循环遍历对象,但这哥们有个坑,不止会遍历对象自身属性,还能遍历原型链上可枚举属性。

const obj1 = {
name: '前端路引',
age: 1,
'favorite-color': 'red',
}
for (let key in obj1) {
console.log(key, obj1[key]);
}
/*
// 输出结果
name 前端路引
age 1
favorite-color red
*/

看个遍历原型链例子:

// 如果有兄弟不小心给对象的原型链上填了一笔
Object.prototype.test = '我是原型链上的测试属性'; const obj1 = {
name: '前端路引',
age: 1,
'favorite-color': 'red',
}
for (let key in obj1) {
console.log(key, obj1[key]);
}
/*
// 输出结果
name 前端路引
age 1
favorite-color red
test 我是原型链上的测试属性
*/ for (const key in obj1) {
if (obj.hasOwnProperty(key)) { // 过滤掉原型链属性
console.log(key, obj1[key]);
}
}
/*
// 输出结果
name 前端路引
age 1
favorite-color red
*/

如上所示,代码编写规范建议不要对 JS 自身的原型链做修改,扩展原型链虽然方便了一些对象操作,但实际上这是埋了雷的,不知道啥时候就会引爆!!

在使用 for in 循环也需要注意原型链的属性,必须使用 hasOwnProperty 方法来过滤掉原型链上的属性。

for of 循环

由于 for in 的各种弊端,后来定规范的大佬们,就新增了一个 for of 循环用于遍历可迭代对象,比如:数组、字符串、Set、Map 等等。

const obj1 = {
name: '前端路引',
age: 1,
'favorite-color': 'red',
}
// for of 循环
for (let [key, value] of Object.entries(obj1)) {
console.log(key, value);
}
/* // 以上 let [key, value] 使用了 解构赋值,其代码等于
for (let item of Object.entries(obj1)) {
const [key, value] = item;
console.log(key, value);
}
// 又等于
for (let item of Object.entries(obj1)) {
const key = item[0];
const value = item[1];
console.log(key, value);
}
*/

for of 无法直接遍历对象,需要遍历对象时,需使用内置方法 Object.entries 将对象转为数组,再使用 for of 遍历,或者使用 Object.keys/Object.values 将对象转为键/值数组再遍历。

相比于 for in 循环,for of 循环性能更好,也不用考虑原型链问题。

while 循环

while 循环多用于不确定循环次数的应用场景,比如读取文件数据流,并不知道需要循环多少次才能读取完。

let i = 0;

while (i < 3) {
console.log(i);
i++;
}

一般能用 for 循环的场景,都能使用 while 循环替代。

do while 循环

这个循环可有意思了,不管条件是否满足,都会先跑一次循环体,再判断条件。

应用场景例子:必须让用户先输入,再判断条件,直到输入正确才继续。

let userInput;
do {
userInput = prompt("请输入一个大于 10 的数字:");
} while (isNaN(userInput) || Number(userInput) <= 10); console.log("有效输入:", userInput);

死循环

在使用循环遍历时候,需特别注意 死循环 问题,条件处理不好,就进入死循环,导致程序崩溃。

比如:

let i = 0;

while (i < 3) {
console.log(i);
// i++; // 忘记修改 i 的值,导致进入死循环
}

善用退出循环

continue / break / return 三个关键字都可以用来处理循环逻辑,不同的是:

  • continue:跳过当前循环,继续下一次循环。
  • break:跳出当前循环,不再继续循环。
  • return:跳出当前函数,不再继续执行。

continue 示例:

function loop1 () {
for (let i = 0; i < 10; i++) {
if (i % 2 === 0) {
continue; // 跳过偶数次循环,只输出奇数次循环
}
console.log(i); // 输出 1 3 5 7 9
}
console.log('循环结束'); // 会执行
}
loop1()

break 示例:

function loop2 () {
for (let i = 0; i < 10; i++) {
if (i === 5) {
break; // 在第 6 次循环退出
}
console.log(i); // 输出 0 1 2 3 4
}
console.log('循环结束'); // 会执行
}
loop2()

return 示例:

function loop3 () {
for (let i = 0; i < 10; i++) {
if (i === 5) {
return; // 在第 6 次循环退出函数,不会执行循环体后面的代码
}
console.log(i); // 输出 0 1 2 3 4
}
console.log('循环结束'); // 此行代码不会执行
}
loop3()

三个退出循环关键字都可以用于所有的循环语句,不要局限于 for 循环~~

写在最后

如果说算法是程序的灵魂,那么循环可以算是算法的基石,很多常见的算法都需要使用循环实现,比如各种数组排序算法、查找算法、最短路径算法等等。

循环是程序中的必修课,任何编程语言都有它的身影。

Web前端入门第 62 问:JavaScript 循环结构注意事项的更多相关文章

  1. web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史

    秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...

  2. Android零基础入门第62节:搜索框组件SearchView

    原文:Android零基础入门第62节:搜索框组件SearchView 一.SearchView概述 SearchView是搜索框组件,它可以让用户在文本框内输入文字,并允许通过监听器监控用户输入,当 ...

  3. web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】

    http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,J ...

  4. web前端(13)—— 了解JavaScript,JavaScript的引入方式

    从本篇博文开始,将进入web前端方便最关键最重要的部分——javascript,学到后面你就知道它真的太重要了 什么是JavaScript JavaScript一种直译式的脚本语言,是一种动态类型.弱 ...

  5. Web前端基础怎么学? JavaScript、html、css知识架构图

    以前开发者只要掌握 HTML.CSS.JavaScript 三驾马车就能胜任一份前端的工作了.而现在除了普通的编码以外,还要考虑如何性能优化,如何跨端.跨平台实现功能,尤其是 AI.5G 技术的来临, ...

  6. WEB前端工程师整理的原生JavaScript经典百例

    一.原生JavaScript实现字符串长度截取 二.原生JavaScript获取域名主机 三.原生JavaScript转义html标签 四.原生JavaScript时间日期格式替换 Date.prot ...

  7. web前端学习之HTML CSS/javascript之一

    前端编码之路之坎坷,web前端应该一直是个战场吧,各种浏览器的不兼容,各种小细节的修改,要往一个好的产品经理方向走,实在是难,昨天听了一位十年经验的产品经理讲座,最重要的恐怕就是协调资源的能力,而协调 ...

  8. 什么是JavaScript循环结构?

    ㈠什么是循环结构 ⑴什么是循环? 反复一遍又一遍的做着相同(相似)的事情 ⑵循环中的两大要素 ①循环条件:什么时候开始,什么时候结束 ②循环操作:循环体,循环过程中,干了什么 ㈡循环结构—while循 ...

  9. Web前端开发规范【HTML/JavaScript/CSS】

    前言 这是一份旨在增强团队的开发协作,提高代码质量和打造开发基石的编码风格规范,其中包含了 HTML, JavaScript 和 CSS/SCSS 这几个部分.我们知道,当一个团队开始指定并实行编码规 ...

  10. web前端——实例中学习css,javascript

    最近闲暇时候在研究前端的样式和js,以前都是从w3school上看看那些选择器和DOM操作方法很少去实际做demo来研究,做的过程当中才真切感觉到纸上得来终觉浅,看得懂跟能做出东西完全两码事,尤其在定 ...

随机推荐

  1. 【MathType】word2016数学公式编号

    问题 毕业论文排版中,对数学公式需要类似(3-1)的格式. 解决技巧 在写论文初稿的时候,先不要于公式的编号,先给它编一个号,比如(3) (2) (4)的. 最后写完了以后,再再添加section , ...

  2. React从webpack迁移到rsbuild 纪实

    Why 随着团队项目规模越来越大之后,继从babel-loader迁移到esbuild之后发现打包.热重载性能随着时间迭代之后又慢慢开始成为性能瓶颈,所以决定用新的打包工具去解决这个问题.esbuil ...

  3. 探秘Transformer系列之(14)--- 残差网络和归一化

    探秘Transformer系列之(14)--- 残差网络和归一化 目录 探秘Transformer系列之(14)--- 残差网络和归一化 0x00 概述 0x01 残差连接 1.1 问题 1.2 相关 ...

  4. go切片排序

    前言 有时候我们需要根据切片中的某个字段进行切片排序,但sort包中只有默认基本类型 int . float64 和 string 的排序,所以我们可以手动实现sort包的 sort.Interfac ...

  5. ANSYS 导出节点的位移数据

    1. 数据保存 确定待提取的节点编号: 获取节点位移变量: 将节点位移变量存储到数组中,用于数据传递: ! 输出对应节点的位移到csv文件 ! 注意同时导入.db和.rst,并切换到/post26模块 ...

  6. 【Git】Git GUI的使用

    在Git命令行一文中已经对Git的操作命令进行了简单的介绍,但是理论知识过于枯燥,使得初学者在Git的使用上还是会有很大的困难.虽然我更推荐使用Git Bash方式对Git进行操作,但是对于大部分只是 ...

  7. 【教程】Windows10系统激活

    Windows10系统激活 一.找一个激活码 到百度搜索,筛选发表日期在最近一个月或者一周之内的 二.以管理员身份打开cmd 按Win+R键,输入cmd打开命令行窗口 按Ctrl+Shift+Esc键 ...

  8. Quartz.NET - 教程 12: Quartz 的其他特性

    译者注: 目录在这 Quartz.NET 3.x 教程 原文在这 Lesson 12: Miscellaneous Features of Quartz 插件 Quartz 提供了一个用于插入附加功能 ...

  9. AI时代:本地运行大模型vllm

    https://docs.vllm.ai/en/latest/index.html 高吞吐量.高内存效率的 LLMs 推理和服务引擎(快速搭建本地大模型,且openAI API 兼容) vLLM is ...

  10. MySQL 中的 MVCC 是什么?

    MySQL 中的 MVCC 是什么? MVCC(Multi-Version Concurrency Control) 是 MySQL 数据库用来处理并发访问的技术,特别是在 InnoDB 存储引擎中, ...