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

ArkTS 核心语法精讲:运算符、空安全与流程控制

引言

写出高效稳定的鸿蒙应用, 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。

二、空安全机制

空值基础概念

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

  • 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 }
方法四:空值合并??

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

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. 空安全机制nullundefined的区别,四种非空校验方法——if/else判空、可选链?.、非空断言!、空值合并??

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

http://www.jsqmd.com/news/1325216/

相关文章:

  • 彻底解决Windows文件删除失败:从权限到路径的完整排查指南
  • 大模型公司集体“造芯“:从 Google 到 DeepSeek,算力自主化成为行业主线
  • 用一篇文章,帮你了解交互设计方法论「渐进式披露」
  • Unity内存碎片化诊断与优化:从原理到实践的全面解决方案
  • C++实战:基于EasyX与博弈树搜索的黑白棋AI开发指南
  • Kubernetes Agent Sandbox:为AI智能体打造云原生部署与管理框架
  • 2026 年江干值得关注的卧室整木 + 慕思软装服务商电话,你家卧室用的贵价木料加软装,竟能让睡眠幸福感翻倍还省事儿?-艺居整家装饰 - 品质体验官
  • SpringBoot+Vue美容院管理系统架构与实现
  • Python+OpenCV人脸识别实战:从环境搭建到照片自动分类
  • 单目测距实战:从相机标定到距离计算的完整指南
  • 在美国如何获得批发许可证:费用和要求
  • 动态规划入门:背包算法核心原理与Python实战详解
  • 猫抓扩展:三步掌握浏览器资源嗅探的终极免费工具
  • 自动驾驶迎来“第二春“:物理 AI 与端到端大模型重塑行业
  • redis跨服分布式全局锁
  • 基于MediaPipe与Unity3D的实时手部追踪与交互开发指南
  • RabbitMQ常见知识点总结
  • Omron C200PC-ISA03-1 印刷电路板
  • 二叉搜索树中第k小的元素
  • Unity网络通信中Curl error 60的根源分析与安全解决方案
  • Python实战进阶:从环境配置到量化交易开发
  • B站视频下载终极指南:三步解锁大会员4K高清视频
  • STM32 U盘模式IAP实现:基于HAL库的固件升级方案详解
  • 战略撤退决策框架:识别时机与执行路径
  • 技术成长:从执行到思考的认知跃迁与工程实践
  • Wi-Fi天线原理与实战调优:从增益、极化到MIMO,彻底改善信号质量
  • RocketMQ 的“全局画面
  • 3步解锁网易云音乐:让加密NCM文件重获播放自由
  • 软件公司生存策略:火箭模式与印钞机模式解析
  • Vue3+Vite项目集成Unity WebGL:解决路径与构建配置的完整指南