鸿蒙开发入门:ArkTS 运算符与分支循环全解析(含实战案例 + 避坑指南)
在鸿蒙应用开发中,ArkTS 作为官方主推的开发语言,其基础语法是搭建所有功能的基石。而运算符与分支循环,更是每段业务逻辑都离不开的 “砖瓦”—— 从简单的变量赋值,到复杂的条件判断、数据遍历,都需要它们来实现。
今天这篇文章,我们就从基础概念入手,结合实战案例,系统讲解 ArkTS 的运算符、分支结构与循环结构,同时补充新手容易踩的坑和最佳实践,无论是鸿蒙入门小白,还是需要巩固基础的开发者,都能有所收获。
ArkTS 核心运算符:6 大类全覆盖
ArkTS 的运算符按功能可分为 6 类,每类都有明确的使用场景。我们先梳理各类运算符的定义、语法,再用代码案例演示实际效果(和咱们C语言的赋值运算符类似,大家可以参考这篇文章 C语言运算符)。
- 赋值运算符:变量初始化与更新
作用:给变量赋值,或结合运算进行赋值(复合赋值)。
核心运算符:
- 基础赋值:
=
(最常用,如let a = 10
) - 复合赋值:
+=
、-=
、*=
、/=
、%=
、<<=
、>>=
、>>>=
、&=
、|=
、^=
- 算术运算符:数值计算的核心
作用:实现加减乘除、取余等数值运算,分 “一元运算符” 和 “二元运算符”。
核心运算符:
- 一元运算符:
+
(正号)、-
(负号)、++
(自增)、--
(自减)(仅需 1 个操作数) - 二元运算符:
+
(加)、-
(减)、*
(乘)、/
(除)、%
(取余)(需 2 个操作数)
避坑点:++
放在变量前(++count
)和后(count++
)的区别 —— 前者 “先自增再使用”,后者 “先使用再自增”,比如let res = count++
中,res 是 5,count 变成 6;let res = ++count
中,res 是 6,count 也是 6。
-
关系运算符:判断条件的基础
作用:比较两个值的关系,返回true
(成立)或false
(不成立),也称 “比较运算符”。
核心运算符:==
(等于)、!=
(不等于)、>
(大于)、<
(小于)、>=
(大于等于)、<=
(小于等于)
注意:==
仅比较 “值是否相等”,若需严格比较 “值 + 类型”(如10
和"10"
),需用===
(严格等于),ArkTS 推荐优先使用===
避免类型隐式转换的坑。 -
逻辑运算符:组合条件判断
作用:对多个布尔值进行逻辑组合,返回最终的true
或false
,常用于复杂条件判断。
核心运算符:
&&
(逻辑与):所有条件都成立才返回true
(一假则假)||
(逻辑或):只要有一个条件成立就返回true
(一真则真)!
(逻辑非):反转布尔值(true
变false
,false
变true
)
技巧:逻辑运算符支持 “短路求值”——&&
若第一个条件为false
,后续条件不再执行;||
若第一个条件为true
,后续条件不再执行,可用于简化代码(比如const name = user?.name || "默认名称"
)。
-
位运算符:直接操作二进制(相对用的比较少,位运算符在算法竞赛中会接触的比较多)
作用:将数值转换为二进制后,按位进行运算,性能极高,但在 ArkTS 业务开发中使用较少。 -
三元运算符:简化二选一判断
作用:替代简单的if-else
,实现 “条件成立返回 A,否则返回 B”,语法简洁。
语法:条件 ? 表达式1(成立时执行) : 表达式2(不成立时执行)
避坑点:三元运算符不建议嵌套(如a ? b : c ? d : e
),会严重降低代码可读性,复杂条件建议用if-else
。
二、ArkTS 分支与循环:控制代码执行流程
有了运算符,我们可以计算和判断;但要实现 “根据条件走不同逻辑” 或 “重复执行某段代码”,还需要分支结构和循环结构,整体上和C语言是巨类似的。
-
分支结构:按条件执行不同逻辑
ArkTS 的分支结构主要有两类:if-else
(处理区间或复杂条件)和switch
(处理固定值匹配)。 -
循环结构:重复执行代码块
ArkTS 的循环结构有 4 种:for
、for-of
、while
、do-while
,分别适用于不同的遍历场景。
大家学过C语言的话,对for
、while
、do-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)}
}
大家可以点击具体按钮,结合代码,在控制台上看到具体结果,如图:
四、避坑指南与最佳实践
- 运算符优先级:记住核心优先级(括号 > 一元运算符 > 算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符),不确定时加括号(如
(a + b) * c
)。 - switch 穿透:每个
case
必须加break
,除非有意利用穿透(如多个值对应同一逻辑)。 - 死循环预防:
while
/do-while
必须更新循环条件变量;for
循环确保 “初始化 - 条件 - 更新” 完整。 - 类型一致性:关系运算符(如
==
)和逻辑运算符避免混合不同类型(如10 == "10"
),优先用===
。 - 代码可读性:三元运算符不嵌套,
if-else
条件复杂时拆分函数,循环体过长时提取子函数。
运算符与分支循环是 ArkTS 的基础,也是所有复杂功能的 “地基”—— 运算符负责 “计算与判断”,分支循环负责 “控制流程”。如果你在学习过程中遇到了具体问题,或者有更优的实现方案,欢迎在评论区交流~ 后续我们还会讲解 ArkTS 的函数、类、接口等进阶内容,关注不迷路!
若你想系统学习鸿蒙开发,深入掌握更多 ArkTS 核心技术,拿到基础、高级等开发者证书,欢迎加入我的鸿蒙班,一起从入门到精通:点击免费加入