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

143 阅读7分钟

在鸿蒙应用开发中,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 = 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)
  }
}

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

四、避坑指南与最佳实践

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

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

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