在鸿蒙应用开发中,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 = 10
let b = 3
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}`) // 取余
// 前置自增 vs 后置自增
let count1 = 5
let result1 = count1++ // 先使用后自增
console.log(`后置自增: result1 = ${result1}, count1 = ${count1}`)
let count2 = 5
let result2 = ++count2 // 先自增后使用
console.log(`前置自增: result2 = ${result2}, count2 = ${count2}`)
})
// 2. 关系运算符
Button('关系运算符').onClick(() => {
console.log('=== 关系运算符示例 ===')
let a = 10
let b = 3
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} != ${b} = ${a != b}`) // 不等于
console.log(`${a} === '10' = ${a === 10}`) // 严格等于(值和类型都相等)
console.log(`${a} !== '10' = ${a !== 10}`) // 严格不等于
})
// 3. 逻辑运算符
Button('逻辑运算符').onClick(() => {
console.log('=== 逻辑运算符示例 ===')
let hasPermission = true
let isAdult = false
console.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 = 85
let grade = score >= 90 ? "优秀" :
score >= 80 ? "良好" :
score >= 60 ? "及格" : "不及格"
console.log(`score=${score}, grade=${grade}`)
})
// 5. 分支结构 - if-else
Button('if-else分支').onClick(() => {
console.log('=== if-else分支示例 ===')
let age = 20
if (age >= 18) {
console.log('您已成年,可以进入')
} else {
console.log('您未成年,禁止进入')
}
// 多条件判断
let score = 85
if (score >= 90) {
console.log('成绩优秀')
} else if (score >= 80) {
console.log('成绩良好')
} else if (score >= 60) {
console.log('成绩及格')
} else {
console.log('成绩不及格')
}
})
// 6. 分支结构 - switch
Button('switch分支').onClick(() => {
console.log('=== switch分支示例 ===')
let grade = 'B'
switch (grade) {
case 'A':
console.log('优秀')
break
case 'B':
console.log('良好')
break
case 'C':
console.log('及格')
break
default:
console.log('不及格')
}
// 穿透示例(故意不加break)
let day = 2
console.log('星期' + day + '的活动:')
switch (day) {
case 1:
console.log('周一会议')
case 2:
console.log('周二培训') // 会执行
case 3:
console.log('周三团建') // 也会执行(穿透)
break
case 4:
console.log('周四休息')
break
default:
console.log('周末放松')
}
})
// 7. 循环结构 - for
Button('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-of
Button('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. 循环结构 - while
Button('while循环').onClick(() => {
console.log('=== while循环示例 ===')
// while循环
let i = 0
while (i < 3) {
console.log(`while循环: ${i}`)
i++ // 不要忘记更新循环变量
}
// do-while循环(至少执行一次)
let j = 0
do {
console.log(`do-while循环: ${j}`)
j++
} while (j < 3)
})
// 10. break 和 continue
Button('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 核心技术,拿到基础、高级等开发者证书,欢迎加入我的鸿蒙班,一起从入门到精通:点击免费加入