JavaScript青少年简明教程:流程控制语句

JavaScript青少年简明教程:流程控制语句

JavaScript 提供了一系列的流程控制语句,用于控制代码的执行顺序。

条件语句

条件语句根据表达式的真假来执行不同的代码块。

if 语句

用于在条件为真时执行代码块。

语法:

if(条件){

    条件满足执行的语句;

}

【或者写为:

if(条件)

{

    条件满足执行的语句;

} 】

说明:这个“条件”一般是一个比较表达式。如果“条件”返回为true,则会执行大括号{}内部的程序;如果“条件”返回为false,则会直接跳过大括号{}内部的程序,然后按照顺序来执行后面的程序。

由大括号括起来的程序,我们又称为“语句块”。

流程控制图:

例:

let age = 18;
if (age >= 18) {console.log("You are an adult.");
}

if...else 语句

用于在条件为真时执行一个代码块,否则执行另一个代码块。

语法:

if(条件表达式){

    条件成立执行的语句;

}Else{

    条件不成立执行的语句;

}

【或者写为:

if(条件表达式)

{

    条件成立执行的语句;

}

Else

{

    条件不成立执行的语句;

} 】

流程控制图:

例:

let age = 16;
if (age >= 18) {console.log("You are an adult.");
} else {console.log("You are a minor.");
}

if...else if...else 语句

用于测试多个条件。

语法:

if(条件1){

    语句或语句块1

}

else if (条件2){

语句或语句块1

}

Else{

    语句或语句块K

}

说明:

多向选择语法看似很复杂,其实也是非常简单的,它只是在双向选择基础上再增加一个或多个选择分支罢了。

流程控制图:

例:

let age = 20;
if (age < 18) {console.log("未成年人");
} else if (age < 60) {console.log("成年人");
} else {console.log("老年人");
}

可以在 if 语句中嵌套另一个 if 语句,以处理更复杂的条件逻辑。例如,下面的代码检查一个数字是否为偶数,并且是否为正数:

const num = 6;if (num > 0) {if (num % 2 === 0) {console.log("Positive even number");} else {console.log("Positive odd number");}
} else {console.log("Not a positive number");
}

switch 语句

用于根据不同的条件执行不同的代码块。

语法:

switch(判断值){

    case 取值1:

        语块1;

        [break;]

    case 取值2:

        语块2;

        [break;]

    case 取值3:

        语块3;

        [break;]

    ……

    [default:

        语句块k;

        [break;]]

}

switch 语句用于基于表达式的值来执行不同的代码块。

在switch语句中,系统会从第1个case开始判断,从找到满足条件的部分执行。

default 子句在没有匹配的 case 时执行。[ ]部分代表是可选的,default 部分是可选的(不是必须有的),它将在所有 case 都不匹配时执行。

break 可避免“fall-through”(“贯穿”、“穿透)行为。break语句用于结束switch语句,从而使JavaScript仅仅执行对应的一个分支。如果没有了break语句,则该switch语句中“对应的分支”被执行后还会继续执行后面的分支。

【尽管在 default 后面通常不需要 break,default部分可以有 break也不会有任何问题。】

流程控制图:

或者

例:

let day = 3;
switch (day) {case 1:console.log("Monday");break;case 2:console.log("Tuesday");break;case 3:console.log("Wednesday");break;default:console.log("Invalid day");
}

循环语句

循环语句用于重复执行代码块。

for 循环

用于在已知次数时重复执行代码块。

语法:

for( 循环变量初始化 ; 条件表达式 ; 循环变量自增 ){

    循环体

}

循环变量初始化用于初始化表达式,一般用于定义“用于计数的变量”的初始值;条件表达式,含有条件变量的表达式;循环变量自增,指的是执行循环体(也就是大括号中的程序语句)后的操作,用于更新条件变量。

流程控制图:

例:

for (let i = 0; i < 5; i++) {console.log(i);
}

可以在 for 循环中嵌套另一个 for 循环,这在处理二维数组(矩阵)或需要更复杂处理的数据结构时非常有用。例如:

for (let i = 1; i <= 3; i++) {for (let j = 1; j <= 3; j++) {console.log(`i = ${i}, j = ${j}`);}
}

该示例将分别打印 i 和 j 的组合,从 i = 1, j = 1 到 i = 3, j = 3。

while 语句

用于在条件为真时重复执行代码块。

语法:

while(条件表达式){

    循环体

}

说明:

如果“条件表达式”返回为true,则会执行大括号{}内部的循环体(也就是大括号中的程序语句),一直到条件为false才结束整个循环,然后再接着执行while语句后面的程序。

流程控制图:

let sum = 0;
let i = 1;while (i <= 5) {sum += i;i++;
}console.log("Sum:", sum);  // 输出:Sum: 15

本例将计算从 1 到 5 的总和并输出,示例中,当 i 小于或等于 5 时,循环体内的代码将持续执行。每次迭代,i 的值会增加 1,直到条件变为假为止。

do...while 语句

类似于 while 循环,但先执行一次代码块,然后在条件为真时继续执行。

语法:

do{

    循环体

}while(条件);

说明:

do…while语句首先是无条件执行循环体一次,然后再判断是否符合条件。如果符合条件,则重复执行循环体;如果不符合条件,则退出循环。

流程控制图:

例:

let sum = 0;
let i = 1;do {sum += i;i++;
} while (i <= 5);console.log("Sum:", sum);  // 输出:Sum: 15

本例将计算从 1 到 5 的总和并输出,在这个示例中,不论 i 的初始值如何,循环体内的代码将至少执行一次,然后再检查条件。

通常在循环体内的代码需要含有改变循环条件的语句,以确保循环能够在适当的时间终止。否则,循环可能会变成无限循环,从而导致程序无法停止并可能导致系统崩溃或其他意外行为。

while 语句和do...while 语句的区别:

while 语句:先检查条件,再决定是否执行循环体内的代码。如果条件一开始为假,循环体内的代码将不会执行。

do...while 语句:先执行一次循环体内的代码,再检查条件。如果条件为假,循环将终止,但循环体内的代码至少会执行一次。

可以嵌套 while 或 do...while 循环来处理更复杂的情况。例如

let i = 1;while (i <= 3) {let j = 1;while (j <= 3) {console.log(`i = ${i}, j = ${j}`);j++;}i++;
}

在这个示例中,外层循环 i 控制的每次迭代,内层循环 j 将从 1 运行到 3

for...in 语句

用于遍历对象的可枚举属性。它适用于对象的属性遍历,但不适合数组或其他可迭代对象的遍历。

语法

for (variable in object){

    代码块

}

variable 是用来存放每次迭代的属性名的变量。

object 是要迭代的对象。

流程控制图:

例:

const person = {name: "John",age: 30,city: "New York"
};for (let key in person) {console.log(`${key}: ${person[key]}`);
}

输出:

name: John
age: 30
city: New York

注意事项

1、for...in 不保证属性遍历的顺序,属性顺序是由 JavaScript 引擎定义的。

2、for...in 也会遍历对象从原型链上继承的可枚举属性。

3、不推荐在数组上使用 for...in,因为它遍历的是索引,并且可能会遍历到继承属性或非索引属性。

for...of 语句

用于遍历可迭代对象(包括数组、字符串、Map、Set、arguments 对象等)的元素。它无法直接遍历普通对象,因为普通对象不是可迭代对象。通常用于数组的值遍历。

语法

for (variable of iterable){

    代码块

}

variable 是用来存放每次迭代的值的变量。

iterable 是一个可迭代对象。

流程控制图:

特别提示,在JavaScript中,当我们使用for...of循环时,它在背后使用了迭代器(iterator)协议。关于迭代器(iterator)和for...of 语句,初学者可以先了解,不要深究。下面给出几个for...of 语句示例。

例1、遍历数组

const array = [10, 20, 30, 40];for (let value of array) {console.log(value);
}

输出:

10
20
30
40

例2、遍历字符串

const str = "hello";for (let char of str) {console.log(char);
}

输出:

h
e
l
l
o

例3、遍历Map

const map = new Map();
map.set('name', 'John');
map.set('age', 30);for (let [key, value] of map) {console.log(`${key}: ${value}`);
}

输出:

name: John
age: 30

例4、遍历Set

const set = new Set([1, 2, 3, 4]);for (let value of set) {console.log(value);
}

输出:

1
2
3
4

注意事项

1、for...of 按照可迭代对象的顺序进行遍历,通常是插入的顺序。

2、只能用于可迭代对象,如果对非可迭代对象使用 for...of,会抛出错误。

注意事项

1、for...of 按照可迭代对象的顺序进行遍历,通常是插入的顺序。

2、只能用于可迭代对象,如果对非可迭代对象使用 for...of,会抛出错误。

for...in 和 for...of 的比较

适用对象:

for...in:适用于对象属性的遍历,不推荐用于数组,因为它遍历的是键名,可能会意外地遍历到继承的属性或原型链上的属性。

for...of:适用于可迭代对象(如数组、字符串、Map、Set 等),遍历的是元素的值。

返回值:

for...in:返回对象的可枚举属性的键名(字符串或 Symbol)。

for...of:返回可迭代对象的每个元素的值。

遍历顺序:

for...in:不保证顺序,特别是在对象上使用时,属性遍历的顺序是由 JavaScript 引擎定义的。

for...of:按元素插入的顺序遍历。

注意事项

避免在数组上使用 for...in:在数组上使用 for...in 可能会意外地遍历到数组的非索引属性或继承的属性。

break 语句

用于立即退出循环或 switch 语句。

循环一旦遇到 break,将不会继续执行,而是跳出循环。

例:

for (let i = 0; i < 5; i++) {if (i === 3) {break;}console.log(i);
}

输出:

0
1
2

continue 语句

continue 语句用于跳过当前循环中的剩余代码,并立即进入下一次循环迭代。在 for 循环中,它会跳到更新表达式,在 while 和 do...while 循环中,它会跳到条件检查部分。

例:

for (let i = 0; i < 10; i++) {if (i % 2 === 0) {continue;}console.log(i);
}

当 i 是偶数时,continue 语句执行,跳过 console.log(i),直接进入下一次迭代。

输出:

1
3
5
7
9

在嵌套循环中,break 和 continue 通常只影响它们所在的最近一级循环。

标签(Label)与 break 和 continue

在 JavaScript 中,可以使用标签与 break 和 continue 结合来跳出多层循环或跳到指定循环。使用标签可以使 break 和 continue 控制多层循环。

例、嵌套循环中的 break

outerLoop: for (let i = 0; i < 3; i++) {for (let j = 0; j < 3; j++) {if (j === 1) {break outerLoop;}console.log(`i = ${i}, j = ${j}`);}
}

输出:

i = 0, j = 0

例、嵌套循环中的continue

outerLoop: for (let i = 0; i < 3; i++) {for (let j = 0; j < 3; j++) {if (j === 1) {continue outerLoop;}console.log(`i = ${i}, j = ${j}`);}
}

输出:

i = 0, j = 0
i = 1, j = 0
i = 2, j = 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/49169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序获取蓝牙并实现内容打印

通过微信小程序如何实现获取蓝牙打印机并实现打印能力&#xff0c;之前做过一个测试Dome&#xff0c;能够获取附近的蓝牙打印机设备并实现打印,今天开放出来供大家参考。 wxml <!--右下角搜索--> <view class"ly-cass-box"><view class"ly-cas…

Hadoop、HDFS、MapReduce 大数据解决方案

本心、输入输出、结果 文章目录 Hadoop、HDFS、MapReduce 大数据解决方案前言HadoopHadoop 主要组件的Web UI端口和一些基本信息MapReduceMapReduce的核心思想MapReduce的工作流程MapReduce的优缺点Hadoop、HDFS、MapReduce 大数据解决方案 编辑 | 简简单单 Online zuozuo 地址…

广义线性模型(1)广义线性模型详解

一 GLM概述 广义线性模型&#xff08;Generalized Linear Models&#xff0c;GLM&#xff09;由 Nelder 和 Wedderburn 于 1972年提出和发表 &#xff0c;旨在解决普通线性回归模型无法处理因变量离散&#xff0c;并发展能够解决非正态因变量的回归建模任务的建模方法。 在广…

数据结构:二叉搜索树(简单C++代码实现)

目录 前言 1. 二叉搜索树的概念 2. 二叉搜索树的实现 2.1 二叉树的结构 2.2 二叉树查找 2.3 二叉树的插入和中序遍历 2.4 二叉树的删除 3. 二叉搜索树的应用 3.1 KV模型实现 3.2 应用 4. 二叉搜索树分析 总结 前言 本文将深入探讨二叉搜索树这一重要的数据结构。二…

【PyTorch】单目标检测项目

对象检测是在图像中查找特定对象位置的过程,用于处理单对象或多对象检测问题。单对象检测在给定图像中仅定位一个对象。对象的位置可以通过边界框定义。单对象检测使用四个数字预测边界框。对于正方形物体&#xff0c;可以固定宽度和高度&#xff0c;并简化问题以仅预测两个数字…

Unity:PC包直接查看Log日志

PC端会输出Log日志&#xff0c;位置在&#xff1a; C:\Users\用户名\AppData\LocalLow\公司名\项目名 在这里可以找到类似的文件&#xff1a; 打开便可以看到打印。

解决 elementUI 组件在 WebStorm 中显示为未知标签的问题

解决 elementUI 组件在 WebStorm 中显示为未知标签的问题 一、问题 自从转到 ts 之后&#xff0c;编辑器就一直提示用到的 elementUI 标签未知&#xff0c;一直显示一溜黄色警示&#xff0c;很烦&#xff1a; 二、解决 把它改成大写就可以了。 如下&#xff1a; 把整个项目…

springboot实战(十二)之通过注解的方式记录接口出入参log入库

前言 生产过程中&#xff0c;为了更好的辅助线上问题排查避免不了对接口出入参进行日志输出的时候&#xff0c;并且为了分析接口数据效果需要将每次请求接口的出入参进行落库方便后续的数据分析&#xff0c;这时总不能每个接口入参之后、出参之前都打印一遍日志吧&#xff1f;如…

51单片机嵌入式开发:16、STC89C52RC 嵌入式之 步进电机28BYJ48、四拍八拍操作

STC89C52RC 嵌入式之 步进电机28BYJ48、四拍八拍操作 STC89C52RC 之 步进电机28BYJ48操作1 概述1.1 步进电机概述1.2 28BYJ48概述 2 步进电机工作原理2.1 基本原理2.2 28BYJ48工作原理2.3 28BYJ48控制原理 3 电路及软件代码实现4 步进电机市场价值 STC89C52RC 之 步进电机28BYJ…

使用约束布局该如何设置哪个视图(UILabel)的内容优先被压缩?

引言 在实际项目开发中&#xff0c;约束布局给我们带来了很大的便利&#xff0c;可以帮助我们创建灵活且响应迅速的用户界面。通常情况下&#xff0c;它都能很好地工作&#xff0c;但在一些包含许多UILabel的场景中&#xff0c;比如会话列表的UI&#xff0c;哪个视图会被优先压…

《0基础》学习Python——第二十讲__网络爬虫/<3>

一、用post请求爬取网页 同样与上一节课的get强求的内容差不多&#xff0c;即将requests.get(url,headershead)代码更换成requests.post(url,headershead),其余的即打印获取的内容&#xff0c;如果content-typejson类型的&#xff0c;打印上述代码的请求&#xff0c;则用一个命…

2024论文精读:利用大语言模型(GPT)增强上下文学习去做关系抽取任务

文章目录 1. 前置知识2. 文章通过什么来引出他要解决的问题3. 作者通过什么提出RE任务存在上面所提出的那几个问题3.1 问题一&#xff1a;ICL检索到的**示范**中实体个关系的相关性很低。3.2 问题二&#xff1a;示范中缺乏解释输入-标签映射导致ICL效果不佳。 4. 作者为了解决上…

【Git】(基础篇七)—— IntelliJIDEA集成Git

InteliJ IDEA集成Git 现在有很多的集成工具帮助我们写代码&#xff0c;使用这些工具可以帮助我们加速写代码&#xff0c;很多工具也可以集成git&#xff0c;使用图形工具管理git&#xff0c;相信了解了底层运行逻辑的你能够很快地上手使用这些工具&#xff0c;本文以InteliJ I…

7 Vue3

相比 Vue2 1. 优点 vue3支持vue2的大多数特性&#xff0c;实现对vue2的兼容vue3对比vue2具有明显的性能提升 打包大小减少41%初次渲染快55%&#xff0c;更新快133%内存使用减少54% 更好的支持TypeScript使用Proxy代替defineProperty实现响应式数据 2. 性能提升的原因 静态标…

jmeter-beanshell学习11-从文件获取指定数据

参数文件里的参数可能过段时间就不能用了&#xff0c;需要用新的参数。如果有多个交易&#xff0c;读不同的参数文件&#xff0c;但是数据还是一套&#xff0c;就要改多个参数文件。或者只想执行参数文件的某一行数据&#xff0c;又不想调整参数文件顺序。 第一个问题目前想到…

Ant Design Vue中日期选择器快捷选择 presets 用法

ant写文档的纯懒狗 返回的是一个day.js对象 范围选择时可接受一个数组 具体参考 操作 Day.js 话不多说 直接上代码 <a-range-pickerv-model:value"formData.datePick"valueFormat"YYYY-MM-DD HH:mm:ss"showTime:presets"presets"change&quo…

(前缀和) LeetCode 238. 除自身以外数组的乘积

一. 题目描述 原题链接 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&…

WebRTC通话原理(SDP、STUN、 TURN、 信令服务器)

文章目录 1.媒体协商SDP简介 2.网络协商STUN的工作原理TURN工作原理 3.信令服务器信令服务器的主要功能信令服务器的实现方式 1.媒体协商 比如下面这个例子 A端与B端要想通信 A端视频采用VP8做解码&#xff0c;然后发送给B端&#xff0c;B端怎么解码&#xff1f; B端视频采用…

【论文共读】【翻译】ShuffleNet v1:一种用于移动设备的极其高效的卷积神经网络

[原文地址] https://arxiv.org/pdf/1707.01083 [翻译] 0. 摘要 我们介绍了一种计算效率极高的CNN架构&#xff0c;称为ShuffleNet&#xff0c;该架构专为计算能力非常有限的移动设备&#xff08;例如&#xff0c;10-150 MFLOPs&#xff09;而设计。新架构利用了两个新操作&am…

Ubuntu 22.04.4 LTS (linux) Tomcat 下载 安装配置详细教程

1 官网下载 下载链接 2 ubuntu 服务器安装 #下载 wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.91/bin/apache-tomcat-9.0.91.tar.gz #解压 tar zxvf apache-tomcat-9.0.91.tar.gz sudo mv apache-tomcat-9.0.91/ /data/tomcat #配置环境变量 sudo vi /etc/profil…