引言

写出高效稳定的鸿蒙应用, ArkTS 的三个核心知识点非常重要:运算符、空安全机制和流程控制语句。运算符决定了数据的计算方式,空安全可以避免程序因空值崩溃,流程控制则让代码能够根据不同情况灵活执行逻辑。本节课将系统讲解这三部分内容,为后续鸿蒙应用开发筑牢基础。

核心内容

一、运算符分类

赋值运算符

赋值运算符分为基础赋值和复合赋值两类:

  • 基础赋值:使用 = 直接赋值,如 a = 5

  • 复合赋值:包含 +=-=*=/=%=<<=>>=>>>=&=|=^=

复合赋值可以简化写法,例如 a = a + 5 可简写为 a += 5,两者效果完全一致。

比较运算符

比较运算符用于比较两个值的相等性与大小,分为两类:

类型 运算符 特点
严格比较 ===!== 同时比较值和数据类型,两者均相等才返回 true
宽松比较 ==!=><>=<= 只比较数值,会自动转换数据类型

示例

let a: number = 1;
let b: string = "1";

console.log(a === b);  // false(值和类型均相等才为 true)
console.log(a == b);   // true(自动类型转换后数值相等)

开发实战中推荐优先使用宽松比较 ==,可以避免类型转换带来的意外错误。

算术运算符

算术运算符用于对数字类型进行数学运算:

  • 一元运算符:正号 +、负号 -、自增 ++、自减 --

  • 二元运算符+-*/%(取余)

自增/自减的位置规则

写法 规则
result = count++(后置) 先赋值(result = count),后运算(count 自增)
result = ++count(前置) 先运算(count 自增),后赋值(result = count

示例

let count: number = 5;
let result1 = count++;  // result1 = 5, count = 6
let result2 = ++count;  // result2 = 7, count = 7

注意:程序中乘号使用 * 表示,取余使用 % 表示。

逻辑运算符

逻辑运算符用于布尔值的逻辑判断,返回布尔结果:

运算符 名称 规则
&& 逻辑与 所有条件为真时才返回 true
|| 逻辑或 任一条件为真时返回 true
! 逻辑非 对布尔值取反

短路求值:逻辑与和逻辑或支持短路求值,即第一个条件已可确定结果时,不会执行第二个条件,提升运行效率。

false && anyExpression;   // 直接返回 false,不执行 anyExpression
true || anyExpression;    // 直接返回 true,不执行 anyExpression
位运算符

位运算符直接对整数的二进制位进行操作,常用于性能优化和数据压缩场景:

  • 基础位运算符&(按位与)、|(按位或)、^(按位异或)、~(按位取反)

  • 位移运算符<<(左移)、>>(算术右移)、>>>(逻辑右移)

以按位与 & 为例:两个操作数对应二进制位都为 1 时,结果位才为 1,否则为 0。

二、空安全机制

空值基础概念

声明变量时若无法确定初始值,可将其声明为可空类型,允许保存 null 或 undefined

  • null:主动赋值的空值,常用于清空对象引用。

  • undefined:表示变量未初始化,或对象不存在该属性。

let name: string | null = null;        // 显式空值
let age: number | undefined;           // 未初始化

如果使用可空变量时不做非空检查,程序在编译或运行时将报错。ArkTS 提供了四种非空校验方法:

方法一:if/else 判空

通过条件判断手动校验非空,只有变量不为空时才执行操作。

function checkName(name: string | null) {
  if (name !== null) {
    console.log(name);
  }
}
方法二:可选链 ?.

如果调用对象为 null,运算符会直接返回 undefined,不会抛出错误。

function nullSafetyWithOptionalChaining(obj: Object | null): string | undefined {
  return obj?.toString();
}
方法三:非空断言 !

断言运算符左侧的值一定非空,编译器允许通过编译。若运行时实际值为空,仍会抛出异常,使用时必须确保变量一定非空。

function nullSafetyWithAssertion(obj: Object | null): string {
  return obj!.toString();  // 必须确保 obj 不为 null
}
方法四:空值合并 ??

如果运算符左侧值为 null 或 undefined,则返回右侧的默认值;否则返回左侧的值。

let name: string | null = null;
const res = name ?? '';  // res = ''

空安全机制可在编译阶段提前发现空值问题,大幅提升应用稳定性,是开发中必须掌握的核心机制。

三、流程控制语句

条件语句

if/else 语句:根据条件执行不同分支逻辑,也可使用三目条件表达式简化写法。

// if/else 写法
let hasTicket: boolean = true;
if (hasTicket) {
  console.log('放行');
} else {
  console.log('禁止');
}

// 三目表达式写法
let result = hasTicket ? '放行' : '禁止';

switch 语句:根据表达式的不同取值匹配对应代码块,适合多分支场景。

switch (day) {
  case 1:
    console.log('星期一');
    break;
  case 2:
    console.log('星期二');
    break;
  case 3:
    console.log('星期三');
    break;
  case 4:
    console.log('星期四');
    break;
  case 5:
    console.log('星期五');
    break;
  case 6:
  case 7:
    console.log('周末');
    break;
  default:
    console.log('输入错误,请输入1-7之间的数字');
}

每个 case 分支必须添加 break 语句,否则匹配成功后会继续执行后续所有 case,引发逻辑错误。

循环语句

ArkTS 支持四种循环形式,均可用于遍历数组元素:

1. for 语句:通过索引遍历。

let students: string[] = ['XiaoMing', 'XiaoZhang', 'XiaoWang', 'XiaoLi'];
for (let i = 0; i < students.length; i++) {
  console.log(students[i]);
}

2. for-of 语句:直接遍历可迭代对象,无需操作索引。

for (let student of students) {
  console.log(student);
}

3. while 语句:循环条件在执行循环体之前判断。

let index = 0;
while (index < students.length) {
  console.log(students[index]);
  index++;
}

4. do-while 语句:循环条件在执行循环体之后判断,循环体至少执行一次。

let index = 0;
do {
  console.log(students[index]);
  index++;
} while (index < students.length);
循环控制语句

break 语句:立即终止当前整个循环,跳出循环体。

// 输出 0 1 2
for (let i = 0; i < 5; i++) {
  if (i === 3) {
    break;   // i=3 时退出循环
  }
  console.log(i + ' ');
}

continue 语句:跳过当前循环迭代的剩余代码,直接进入下一次循环条件判断。

// 输出 0 1 2 4
for (let i = 0; i < 5; i++) {
  if (i === 3) {
    continue;   // 跳过 i=3 的迭代
  }
  console.log(i + ' ');
}

break 跳出整个循环,continue 只跳过本次迭代,二者作用完全不同,不可混淆。

异常处理语句

throw 语句:手动主动抛出异常,传递错误信息。

function checkAge(age: number) {
  if (age < 0) {
    throw new Error('年龄不能为负数');
  }
}

try-catch-finally 语句

  • try:包裹可能出错的代码。

  • catch:捕获并处理异常。

  • finally:无论是否发生异常都会执行,通常用于释放资源(关闭文件、断开网络等)。

try {
  checkAge(-5);
} catch (error) {
  console.log('捕获到异常:' + error.message);
} finally {
  console.log('资源释放');
}

总结

本节课系统讲解了 ArkTS 的三个核心知识点:

  1. 运算符:赋值运算符(基础赋值与复合赋值)、比较运算符(严格比较 === 与宽松比较 == 的区别)、算术运算符(重点:自增/自减的位置规则)、逻辑运算符(重点:短路求值机制)、位运算符(按位与、位移等)。

  2. 空安全机制null 与 undefined 的区别,四种非空校验方法——if/else 判空、可选链 ?.、非空断言 !、空值合并 ??

  3. 流程控制语句if/else 与 switch 条件语句(switch 需添加 break)、for/for-of/while/do-while 四种循环形式、break 与 continue 的控制区别、throw 与 try-catch-finally 异常处理机制。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐