当前位置: 首页 > ai >正文

鸿蒙开发入门:ArkTS 运算符与分支循环全解析(含实战案例 + 避坑指南)

在鸿蒙应用开发中,ArkTS 作为官方主推的开发语言,其基础语法是搭建所有功能的基石。而运算符与分支循环,更是每段业务逻辑都离不开的 “砖瓦”—— 从简单的变量赋值,到复杂的条件判断、数据遍历,都需要它们来实现。
今天这篇文章,我们就从基础概念入手,结合实战案例,系统讲解 ArkTS 的运算符、分支结构与循环结构,同时补充新手容易踩的坑和最佳实践,无论是鸿蒙入门小白,还是需要巩固基础的开发者,都能有所收获。

ArkTS 核心运算符:6 大类全覆盖

ArkTS 的运算符按功能可分为 6 类,每类都有明确的使用场景。我们先梳理各类运算符的定义、语法,再用代码案例演示实际效果(和咱们C语言的赋值运算符类似,大家可以参考这篇文章 C语言运算符)。

  1. 赋值运算符:变量初始化与更新
    作用:给变量赋值,或结合运算进行赋值(复合赋值)。
    核心运算符:
  • 基础赋值:=(最常用,如let a = 10
  • 复合赋值:+=-=*=/=%=<<=>>=>>>=&=|=^=
  1. 算术运算符:数值计算的核心
    作用:实现加减乘除、取余等数值运算,分 “一元运算符” 和 “二元运算符”。
    核心运算符:
  • 一元运算符:+(正号)、-(负号)、++(自增)、--(自减)(仅需 1 个操作数)
  • 二元运算符:+(加)、-(减)、*(乘)、/(除)、%(取余)(需 2 个操作数)
    避坑点++放在变量前(++count)和后(count++)的区别 —— 前者 “先自增再使用”,后者 “先使用再自增”,比如 let res = count++中,res 是 5,count 变成 6;let res = ++count中,res 是 6,count 也是 6。
  1. 关系运算符:判断条件的基础
    作用:比较两个值的关系,返回 true(成立)或false(不成立),也称 “比较运算符”。
    核心运算符:==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)
    注意==仅比较 “值是否相等”,若需严格比较 “值 + 类型”(如10"10"),需用 ===(严格等于),ArkTS 推荐优先使用===避免类型隐式转换的坑。

  2. 逻辑运算符:组合条件判断
    作用:对多个布尔值进行逻辑组合,返回最终的truefalse,常用于复杂条件判断。
    核心运算符:

  • &&(逻辑与):所有条件都成立才返回true(一假则假)
  • ||(逻辑或):只要有一个条件成立就返回 true(一真则真)
  • !(逻辑非):反转布尔值(truefalsefalsetrue
    技巧:逻辑运算符支持 “短路求值”—— &&若第一个条件为false,后续条件不再执行; ||若第一个条件为true,后续条件不再执行,可用于简化代码(比如const name = user?.name || "默认名称")。
  1. 位运算符:直接操作二进制(相对用的比较少,位运算符在算法竞赛中会接触的比较多)
    作用:将数值转换为二进制后,按位进行运算,性能极高,但在 ArkTS 业务开发中使用较少。

  2. 三元运算符:简化二选一判断
    作用:替代简单的if-else,实现 “条件成立返回 A,否则返回 B”,语法简洁。
    语法:条件 ? 表达式1(成立时执行) : 表达式2(不成立时执行)
    避坑点:三元运算符不建议嵌套(如a ? b : c ? d : e),会严重降低代码可读性,复杂条件建议用if-else

二、ArkTS 分支与循环:控制代码执行流程

有了运算符,我们可以计算和判断;但要实现 “根据条件走不同逻辑” 或 “重复执行某段代码”,还需要分支结构和循环结构,整体上和C语言是巨类似的。

  1. 分支结构:按条件执行不同逻辑
    ArkTS 的分支结构主要有两类:if-else(处理区间或复杂条件)和switch(处理固定值匹配)。

  2. 循环结构:重复执行代码块
    ArkTS 的循环结构有 4 种:forfor-ofwhiledo-while,分别适用于不同的遍历场景。

大家学过C语言的话,对forwhiledo-while,都比较熟悉,这里主要讲for-of循环:

语法:for(变量 of 可迭代对象) { 循环体 }
适用场景:仅需遍历数组、字符串等 “可迭代对象” 的值,无需下标(如打印数组元素)。

Button('for-of循环演示').onClick(() => {const menu = ["红烧肉", "红烧鸡", "红烧排骨", "小炒白菜"];let index = 1;// 直接遍历数组的值,无需手动控制下标for (const food of menu) {console.log(`菜单${index++}${food}`); // 输出与for循环一致}
})

break 与 continue:控制循环流程

  • break:立即终止当前循环,跳出循环体(不再执行后续循环)。
  • continue:跳过当前循环的剩余代码,直接进入下一次循环。

三、实战整合:用运算符 + 分支循环实现 “点餐系统”

我们把前面学的知识点整合起来,实现一个简单的 “点餐系统”,包含以下功能:

  • 展示菜单(循环遍历);
  • 用户选择菜品(switch 匹配);
  • 判断是否点 “红烧鸡”(逻辑运算符);
  • 计算总价(算术运算符)。

综合示例

interface user {name: string;
}@Entry
@Component
struct OperatorDemo {build() {Column({ space: 10 }) {Text('ArkTS 运算符与分支循环示例').fontSize(20).fontWeight(FontWeight.Bold).margin({ bottom: 20 })// 1. 算术运算符Button('算术运算符').onClick(() => {console.log('=== 算术运算符示例 ===')let a = 10let b = 3console.log(`${a} + ${b} = ${a + b}`) // 加法console.log(`${a} - ${b} = ${a - b}`) // 减法console.log(`${a} * ${b} = ${a * b}`) // 乘法console.log(`${a} / ${b} = ${a / b}`) // 除法console.log(`${a} % ${b} = ${a % b}`) // 取余// 前置自增 vs 后置自增let count1 = 5let result1 = count1++ // 先使用后自增console.log(`后置自增: result1 = ${result1}, count1 = ${count1}`)let count2 = 5let result2 = ++count2 // 先自增后使用console.log(`前置自增: result2 = ${result2}, count2 = ${count2}`)})// 2. 关系运算符Button('关系运算符').onClick(() => {console.log('=== 关系运算符示例 ===')let a = 10let b = 3console.log(`${a} > ${b} = ${a > b}`)        // 大于console.log(`${a} < ${b} = ${a < b}`)        // 小于console.log(`${a} >= ${b} = ${a >= b}`)      // 大于等于console.log(`${a} <= ${b} = ${a <= b}`)      // 小于等于console.log(`${a} == ${b} = ${a == b}`)      // 等于(值相等)console.log(`${a} != ${b} = ${a != b}`)      // 不等于console.log(`${a} === '10' = ${a === 10}`)   // 严格等于(值和类型都相等)console.log(`${a} !== '10' = ${a !== 10}`)   // 严格不等于})// 3. 逻辑运算符Button('逻辑运算符').onClick(() => {console.log('=== 逻辑运算符示例 ===')let hasPermission = truelet isAdult = falseconsole.log(`${hasPermission} && ${isAdult} = ${hasPermission && isAdult}`) // 逻辑与console.log(`${hasPermission} || ${isAdult} = ${hasPermission || isAdult}`) // 逻辑或console.log(`!${hasPermission} = ${!hasPermission}`) // 逻辑非// 短路求值示例let user: user = { name: "张三" }let name = user?.name || "默认用户" // 如果user.name存在则使用,否则使用默认值console.log(`用户名称: ${name}`)})// 4. 三元运算符Button('三元运算符').onClick(() => {console.log('=== 三元运算符示例 ===')let age = 20// 基本用法let status = age >= 18 ? "成年人" : "未成年人"console.log(`age=${age}, status=${status}`)// 嵌套用法(不推荐,仅作演示)let score = 85let grade = score >= 90 ? "优秀" :score >= 80 ? "良好" :score >= 60 ? "及格" : "不及格"console.log(`score=${score}, grade=${grade}`)})// 5. 分支结构 - if-elseButton('if-else分支').onClick(() => {console.log('=== if-else分支示例 ===')let age = 20if (age >= 18) {console.log('您已成年,可以进入')} else {console.log('您未成年,禁止进入')}// 多条件判断let score = 85if (score >= 90) {console.log('成绩优秀')} else if (score >= 80) {console.log('成绩良好')} else if (score >= 60) {console.log('成绩及格')} else {console.log('成绩不及格')}})// 6. 分支结构 - switchButton('switch分支').onClick(() => {console.log('=== switch分支示例 ===')let grade = 'B'switch (grade) {case 'A':console.log('优秀')breakcase 'B':console.log('良好')breakcase 'C':console.log('及格')breakdefault:console.log('不及格')}// 穿透示例(故意不加break)let day = 2console.log('星期' + day + '的活动:')switch (day) {case 1:console.log('周一会议')case 2:console.log('周二培训') // 会执行case 3:console.log('周三团建') // 也会执行(穿透)breakcase 4:console.log('周四休息')breakdefault:console.log('周末放松')}})// 7. 循环结构 - forButton('for循环').onClick(() => {console.log('=== for循环示例 ===')// 基本for循环for (let i = 0; i < 5; i++) {console.log(`循环次数: ${i}`)}// 遍历数组let fruits = ["苹果", "香蕉", "橙子"]for (let i = 0; i < fruits.length; i++) {console.log(`水果${i+1}: ${fruits[i]}`)}})// 8. 循环结构 - for-ofButton('for-of循环').onClick(() => {console.log('=== for-of循环示例 ===')let fruits = ["苹果", "香蕉", "橙子"]// 遍历数组值for (let fruit of fruits) {console.log(`水果: ${fruit}`)}// 遍历字符串let str = "Hello"for (let char of str) {console.log(`字符: ${char}`)}})// 9. 循环结构 - whileButton('while循环').onClick(() => {console.log('=== while循环示例 ===')// while循环let i = 0while (i < 3) {console.log(`while循环: ${i}`)i++ // 不要忘记更新循环变量}// do-while循环(至少执行一次)let j = 0do {console.log(`do-while循环: ${j}`)j++} while (j < 3)})// 10. break 和 continueButton('break和continue').onClick(() => {console.log('=== break和continue示例 ===')// break示例console.log('break示例:')for (let i = 0; i < 10; i++) {if (i === 5) {console.log('遇到5,终止循环')break // 当i=5时终止循环}console.log(`当前值: ${i}`)}// continue示例console.log('continue示例:')for (let i = 0; i < 10; i++) {if (i % 2 === 0) {continue // 跳过偶数}console.log(`奇数: ${i}`)}})}.width('100%').height('100%').padding(20).justifyContent(FlexAlign.Center)}
}

大家可以点击具体按钮,结合代码,在控制台上看到具体结果,如图:
在这里插入图片描述

四、避坑指南与最佳实践

  1. 运算符优先级:记住核心优先级(括号 > 一元运算符 > 算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符),不确定时加括号(如(a + b) * c)。
  2. switch 穿透:每个case必须加break,除非有意利用穿透(如多个值对应同一逻辑)。
  3. 死循环预防while/do-while必须更新循环条件变量;for循环确保 “初始化 - 条件 - 更新” 完整。
  4. 类型一致性:关系运算符(如==)和逻辑运算符避免混合不同类型(如10 == "10"),优先用 ===
  5. 代码可读性:三元运算符不嵌套,if-else条件复杂时拆分函数,循环体过长时提取子函数。

运算符与分支循环是 ArkTS 的基础,也是所有复杂功能的 “地基”—— 运算符负责 “计算与判断”,分支循环负责 “控制流程”。如果你在学习过程中遇到了具体问题,或者有更优的实现方案,欢迎在评论区交流~ 后续我们还会讲解 ArkTS 的函数、类、接口等进阶内容,关注不迷路!

若你想系统学习鸿蒙开发,深入掌握更多 ArkTS 核心技术,拿到基础、高级等开发者证书,欢迎加入我的鸿蒙班,一起从入门到精通:点击免费加入

http://www.xdnf.cn/news/19309.html

相关文章:

  • ES6 面试题及详细答案 80题 (13-21)-- 数组与字符串扩展
  • Zynq开发实践(FPGA之平台免费IP)
  • GitHub Spark深度体验:是革命前夜,还是又一个“大厂玩具”?
  • 浅层与深层语义分析的NLP进化论
  • libmodbus移植
  • spi总线
  • Python 实战:内网渗透中的信息收集自动化脚本(6)
  • 【Unity3D实例-功能-切换武器】切换武器(一)动画配置
  • FPGA CIC抽取滤波器设计
  • HarmonyOS 应用开发:基于API 12及以上的新特性与实践
  • TensorFlow 面试题及详细答案 120道(81-90)-- 其他框架/工具
  • 内核Sched调度关于find_idlest_cpu选核逻辑
  • OpenCV 图像处理实战与命令行参数配置:从轮廓检测到模板匹配
  • AI 重构内容创作:从文案生成到视频剪辑,创作者该如何与 AI 协同共生?
  • 一个投骰子赌大小的游戏
  • H264几个参数说明
  • Maya基础:烘焙动画
  • 网络爬虫是自动从互联网上采集数据的程序
  • VSCode的launch.json配置文件在C++项目调试中的全面应用
  • VB.NET 多次添加字符串数据,再转换成一个数组
  • 设计模式概述:为什么、是什么与如何应用
  • 【开题答辩全过程】以 纳雍县咚咚屋服装租赁管理系统为例,包含答辩的问题和答案
  • Java全栈开发面试实录:从基础到微服务的实战解析
  • 路由控制(二):路由策略和策略路由
  • CICD实战(1) - 使用Arbess+GitPuk+Docker快速实现项目打包构建、docker部署
  • 订餐后台管理系统-day06菜品分类模块
  • C++算法学习专题:前缀和
  • 动规一些理解
  • 【MySQL】练习12-4:启用GTID并配置循环复制
  • YUV格式详解