零基础鸿蒙应用开发第三节:变量与基本数据类型
零基础鸿蒙应用开发学习计划表
作为初学者,首先需要掌握的就是变量声明和基本数据类型——这是编写所有代码的基础。本节将带你从零开始,系统学习这些核心知识点,同时养成符合鸿蒙开发规范的编码习惯。
【学习目标】
- 理解变量概念,掌握
let与const的核心区别,熟悉ArkTS的类型推断特性 - 掌握三大常用基本数据类型(
number、string、boolean)的声明方式 - 掌握模板字符串实现日志输出的基础技巧,提升代码可读性
- 掌握单行注释和多行注释的书写规范,养成良好的编码习惯
- 理解空值类型(
null/undefined)的含义,结合联合类型使用 - 掌握联合类型的基本语法,能结合空值实现业务场景的类型定义(如“字符串或空值”)
- 掌握ArkTS核心命名规范(变量/常量),符合鸿蒙官方编码标准
【学习重点】
- 命名规范:变量/常量的命名规则,见名知意、符合鸿蒙官方标准
- 变量声明:
let用于可修改变量,const用于只读变量; - 数据类型:
number/string/boolean的声明语法与基础展示 - 实用技巧:模板字符串的变量插值与多行文本基础用法
- 避坑要点:
const变量不可修改引用;强类型下的变量赋值规范 - 空值与联合类型:
null/undefined单独使用无意义,必须结合联合类型(类型1 | 类型2);联合类型的赋值约束
一、工程结构
本节我们将创建名为VariableTypeDemo的工程,基于鸿蒙5.0(API12)开发,使用DevEco Studio 6.0+工具,核心目录如下:
VariableTypeDemo
├── AppScope # 应用全局配置目录
├── entry # 主模块目录(核心业务模块)
│ ├── src
│ │ ├── main
│ │ │ ├── ets # ArkTS 代码核心目录
│ │ │ │ ├── entryability # 应用入口能力(程序启动/生命周期)
│ │ │ │ ├── entrybackupability # 备份能力(可选)
│ │ │ │ ├── pages # 页面UI目录(仅存放页面组件)
│ │ │ │ │ └── Index.ets # 核心页面(负责UI渲染)
│ │ │ │ └── utils # 我们自己创建的工具目录
│ │ │ │ └── VariableType.ets # 本节学习内容
│ │ │ ├── resources # 静态资源目录(与ets同级)
│ │ │ └── module.json5 # 模块配置文件(声明入口、权限等)
│ ├── mock # 模拟数据目录(可选)
│ ├── ohosTest # 鸿蒙端测试目录
│ ├── test # 单元测试目录
│ ├── .gitignore # Git 忽略规则文件
│ ├── build-profile.json5 # 构建配置文件
│ ├── hvigorfile.ts # 构建脚本
│ ├── obfuscation-rules.txt # 代码混淆规则(可选)
│ └── oh-package.json5 # 依赖包配置文件
├── hvigor # 构建工具依赖
└── oh_modules # 第三方依赖包目录
开发准备步骤
- 打开DevEco Studio,创建
VariableTypeDemo项目(选择Empty Ability模板) - 初始阶段我们将学习内容放在
Index.ets的struct外部,后续会拆分到独立文件(仅为代码结构清晰);所有函数统一在aboutToAppear生命周期方法中调用(组件渲染前的初始化逻辑)

二、变量声明(let 与 const)
在ArkTS中,变量声明使用let和const。不支持使用var声明类型,不支持使用any、unknown做变量类型(TypeScript支持)。
let:声明可修改的变量,适用于动态变化的值(如分数、年龄)const:声明只读变量,初始化后不可修改引用(对于数字、字符串等基本类型,就是不可改值),适用于固定值(如学号、圆周率),推荐优先使用
2.1 代码演示(变量声明)
- 代码逻辑封装:将变量声明逻辑封装到
testVariableDeclaration函数中,定义在struct外部,让代码结构更清晰 aboutToAppear是鸿蒙 ArkUI组件生命周期的核心API,作用是在组件渲染显示到界面之前自动执行初始化逻辑(比如调用业务函数、初始化变量等)。- 在 DevEco Studio 中输入
ab,IDE 会自动联想出aboutToAppear方法,选中联想结果按回车键,即可快速生成完整的方法结构,无需手动完整输入。

/**
* 测试变量声明(let & const)与类型推断特性
*/
function testVariableDeclaration(): void {
// 变量声明:let & const
let currentScore: number = 80;
currentScore = 90; // 合法:let变量可修改
console.log(`【变量声明】修改后分数:${currentScore}`);
// ❌ 错误示范:const变量声明时必须初始化赋值(取消注释会编译报错)
// const studentId: string;
// ✅ 正确写法:const声明+初始化(基本类型不可修改值)
const studentId: string = "20001";
// studentId = "20002"; // 编译报错:const变量不可重新赋值
console.log(`【变量声明】学生学号:${studentId}`);
// 🌟 类型推断:省略类型注解,自动推断类型
let userName = "张三"; // 自动推断为string类型
const pi = 3.1415926; // 自动推断为number类型
let isStudent = true; // 自动推断为boolean类型
console.log(`【类型推断】用户名:${userName},圆周率:${pi},是否为学生:${isStudent}`);
// 补充说明:const仅限制“引用不可修改”,若声明对象/数组(后续知识点),可修改内部属性/元素
// 示例(后续学习对象时详解):
// const user:User = { name: "张三" };
// user.name = "李四"; // 合法:修改对象内部属性
}

2.2 查看运行
- 选择Previewer查看UI预览
- 打开Log面板查看日志输出(底部导航栏Log选项)
- 选择手机设备(phone)运行项目
![变量运行测试]()
后续示例函数均按“定义在struct外部”的规范编写,统一在aboutToAppear中调用(这并不是本节重点,只需关心函数内部变量的定义)
三、数字类型(number)
ArkTS中没有单独的int/long/float类型,所有数值(整数、小数、负数、科学计数法)都统一用number类型存储,这一点和TypeScript一致,相比Java、Object-C等其他语言更简洁。
3.1 核心说明
number类型覆盖所有数值场景,无需区分整数和浮点数- 固定数值推荐用
const声明(如圆周率),可变数值用let声明(如年龄、身高)
3.2 代码逻辑封装:数字类型
/**
* 测试数字类型(number)的声明与使用
*/
function testNumberType(): void {
// 数字类型(number)
let age: number = 20; // 整数
let height: number = 1.75; // 小数
let temperature: number = -5; // 负数
const PI: number = 3.1415926; // 常量
let scientificNum: number = 1.23e5; // 科学计数法(等价于123000)
// 基础展示:输出数字类型变量
console.log(`\n【数字类型】年龄:${age}`);
console.log(`【数字类型】身高:${height}米`);
console.log(`【数字类型】温度:${temperature}℃`);
console.log(`【数字类型】圆周率:${PI}`);
console.log(`【数字类型】科学计数法:${scientificNum}`);
}
运行效果
【数字类型】年龄:20
【数字类型】身高:1.75米
【数字类型】温度:-5℃
【数字类型】圆周率:3.1415926
【数字类型】科学计数法:123000
四、字符串类型(string)
字符串是开发中最常用的类型之一,ArkTS支持多种声明方式,其中模板字符串是最实用的,一定要掌握。
4.1 核心说明
- 支持单引号、双引号、模板字符串三种声明方式
- 模板字符串(用反引号
`包裹)支持变量插值(${变量})和原生多行文本,无需拼接字符串,可读性更高(推荐使用)
4.2 代码逻辑封装:字符串类型
/**
* 测试字符串类型(string)的声明与使用,包含模板字符串特性
*/
function testStringType(): void {
// 独立声明age变量,保证函数可单独调用
let age: number = 20;
// 字符串类型(string)
let userName: string = "张三"; // 双引号声明
let message: string = 'Hello ArkTS'; // 单引号声明
let emptyStr: string = ""; // 空字符串
// 模板字符串:变量插值(拼接字符串的最优写法)
let firstName: string = "张";
let lastName: string = "三";
let fullName: string = `${firstName}${lastName}`;
console.log(`\n【字符串类型】拼接姓名:${fullName}`);
// 模板字符串:插入多个变量
let intro: string = `我叫${fullName},今年${age}岁`;
console.log(`【字符串类型】个人介绍:${intro}`);
// 模板字符串:多行文本(trim()去除首尾空白,优化显示效果)
let multiLine: string = `
第一行内容
第二行内容
第三行内容
`.trim();
console.log(`【字符串类型】多行文本(模板写法):\n${multiLine}`);
// 对比:使用\n换行符实现换行(传统写法,可读性差)
let multiLine1: string = "第一行\n第二行\n第三行";
console.log(`【字符串类型】多行文本(\\n写法):\n${multiLine1}`);
}
运行效果
【字符串类型】拼接姓名:张三
【字符串类型】个人介绍:我叫张三,今年20岁
【字符串类型】多行文本(模板写法):
第一行内容
第二行内容
第三行内容
【字符串类型】多行文本(\n写法):
第一行
第二行
第三行
五、布尔类型(boolean)
布尔类型是后续流程控制(如if判断、while循环)的核心,它只有两个取值:true(真)和false(假)。
5.1 核心说明
- 布尔类型仅用于表示“是否”类的状态(如是否为学生、是否有权限)
- 赋值只能是
true或false,不能是其他值(如1、0,这是和JS的关键区别)
5.2 代码逻辑封装:布尔类型
/**
* 测试布尔类型(boolean)的声明与使用
*/
function testBooleanType(): void {
// 布尔类型(boolean)
let isStudent: boolean = true;
let hasPermission: boolean = false;
let isPass: boolean = true;
let isAdult: boolean = false;
// 基础展示:输出布尔类型变量
console.log(`\n【布尔类型】是否为学生:${isStudent}`);
console.log(`【布尔类型】是否有权限:${hasPermission}`);
console.log(`【布尔类型】是否及格:${isPass}`);
console.log(`【布尔类型】是否成年:${isAdult}`);
}
运行效果
【布尔类型】是否为学生:true
【布尔类型】是否有权限:false
【布尔类型】是否及格:true
【布尔类型】是否成年:false
六、空值类型(null/undefined)与联合类型
在ArkTS中,null和undefined单独使用无意义,必须结合联合类型——这是初学者容易踩坑的点,一定要注意。
6.1 核心说明
1. 空值类型的含义
null:主动设置的空值(如用户暂未设置头像、数据加载失败)undefined:未赋值的默认值(如变量声明后未赋值、暂未考试的分数)
2. 核心规则
null/undefined单独声明无任何业务意义(语法合法但不推荐),必须结合联合类型使用- 禁用
any/unknown:不能用any类型接收空值,需显式声明联合类型(鸿蒙开发规范要求)
3. 联合类型
- 语法:
类型1 | 类型2 | ...(用竖线分隔多个类型),表示变量的取值可以是声明类型中的任意一种 - 常见场景:
string | null(字符串或空值)、number | undefined(数值或未赋值) - 赋值约束:联合类型变量只能赋值为声明的类型之一,否则编译报错
6.2 代码逻辑封装:空值与联合类型
/**
* 测试空值类型(null/undefined)与联合类型的使用规则
*/
function testNullUndefinedAndUnionType(): void {
// 语法合法但无业务意义的示例:单独声明null/undefined
let emptyVar: null = null;
let unassignedVar: undefined = undefined;
console.log(`【空值单独声明】emptyVar: ${emptyVar}, unassignedVar: ${unassignedVar}`);
// 示例1:string | null(业务场景:用户头像地址/暂未设置)
let userAvatar: string | null = "https://example.com/avatar.jpg";
console.log(`\n【联合类型】用户头像:${userAvatar}`);
userAvatar = null; // 模拟用户删除头像
console.log(`【联合类型】用户头像(删除后):${userAvatar}`);
// 示例2:number | undefined(业务场景:分数/暂未考试)
let examScore: number | undefined = 95;
console.log(`【联合类型】考试分数:${examScore}`);
examScore = undefined; // 模拟未考试
console.log(`【联合类型】考试分数(未考试):${examScore}`);
// 示例3:boolean | null | undefined(业务场景:状态/未初始化)
let isVip: boolean | null | undefined = true;
console.log(`【联合类型】是否为VIP:${isVip}`);
isVip = null; // 模拟状态未知
console.log(`【联合类型】是否为VIP(未知):${isVip}`);
isVip = undefined; // 模拟状态未初始化
console.log(`【联合类型】是否为VIP(未初始化):${isVip}`);
// 类型推断:联合类型需显式声明
let productStock = 100; // 自动推断为number类型
console.log(`【类型推断】商品库存:${productStock}`); // 补充日志,避免变量未使用
// productStock = null; // 编译报错:需显式声明number | null
let productStock2: number | null = 50; // 显式声明联合类型
// 错误示例:联合类型赋值超出声明范围(注释演示)
// let temp: string | null = 123; // 编译报错:123是number,不在string | null范围内
}
6.3 运行效果
【空值单独声明】emptyVar: null, unassignedVar: undefined
【联合类型】用户头像:https://example.com/avatar.jpg
【联合类型】用户头像(删除后):null
【联合类型】考试分数:95
【联合类型】考试分数(未考试):undefined
【联合类型】是否为VIP:true
【联合类型】是否为VIP(未知):null
【联合类型】是否为VIP(未初始化):undefined
【类型推断】商品库存:100
七、注释规范
良好的注释是代码的“说明书”,ArkTS有明确的注释规范,你需要从一开始就养成习惯。
7.1 核心说明
- 单行注释:
// 注释内容,用于单行代码说明/注释测试代码; - 单行注释快捷键(mac):
command + /(windows):ctrl + /(批量注释/取消注释) - 多行/文档注释:
/** 注释内容 */,用于函数/类/代码块说明; - 多行注释快捷键(mac):
option+command + /(windows):Ctrl + Shift + / - 也可输入
/**后按Enter,IDE自动生成注释模板 - 规范:注释仅说明为什么(业务逻辑/设计思路),而非是什么(代码本身含义);注释不可嵌套(否则编译报错)
- 注释会被编译器忽略,仅作为代码说明使用
7.2 代码逻辑封装:注释规范
/**
* 演示注释规范:单行注释、多行/文档注释的使用规则
*/
function testCommentSpecification(): void {
// 单行注释:说明代码业务含义(与代码间保留一个空格,规范写法)
let commentDemo: string = "注释示例";
/**
* 输出注释示例变量
* 演示多行/文档注释的基础使用场景
*/
console.log(`\n【注释示例】${commentDemo}`);
// 错误示例:注释不可嵌套(取消注释会编译报错)
// /**
// * 外层注释
// /**
// * 内层注释(禁止写法)
// */
// */
}
八、命名规范
命名是代码可读性的核心,ArkTS严格遵循鸿蒙官方命名标准,入门阶段必须养成规范命名的习惯,避免后续维护困难。
8.1 核心原则
- 见名知意:名称直接体现变量/函数用途,禁止无意义命名(如
a、func1、temp) - 统一风格:全程使用英文,不推荐用拼音、中文、下划线(
_) - 区分场景:
- 变量/函数/局部常量:小驼峰命名法(lowerCamelCase),首字母小写,后续单词首字母大写(如
userName、testStringType、pi) - 全局常量(文件级):全大写+下划线(UPPER_SNAKE_CASE),如
const MAX_AGE: number = 120;
- 变量/函数/局部常量:小驼峰命名法(lowerCamelCase),首字母小写,后续单词首字母大写(如
- 禁止以数字开头,禁止包含特殊符号(如@、空格)
- 以字母或下划线开头,后续可为字母、数字、下划线 如
_price(通常不使用下划线开头,特殊情况下会使用,后续在讲类的属性会讲到) - 禁止使用系统关键词(如let、const、if)
九、完整代码整合
随着功能函数增多,Index.ets会变得臃肿,我们将业务逻辑函数拆分到独立文件,让Index.ets只专注UI相关工作(仅为代码结构清晰):
步骤 1:创建工具文件夹和文件
- 找到项目
src/main/ets目录,右键选择New -> Directory,创建utils文件夹(存放通用函数); - 选中
utils文件夹,右键选择New -> ArkTS File,创建VariableType.ets文件(存放本节所有得学习内容)。
步骤 2:迁移并导出函数
将前面所有业务逻辑函数复制到utils/VariableType.ets,在每个function前添加export关键字(让Index.ets能访问这些函数,模块导入导出后期详解)。
完整代码:utils/VariableType.ets
// src/main/ets/utils/VariableType.ets
/**
* 测试变量声明(let & const)与类型推断特性
*/
export function testVariableDeclaration(): void {
let currentScore: number = 80;
currentScore = 90;
console.log(`【变量声明】修改后分数:${currentScore}`);
const studentId: string = "20001";
console.log(`【变量声明】学生学号:${studentId}`);
let userName = "张三";
const pi = 3.1415926;
let isStudent = true;
console.log(`【类型推断】用户名:${userName},圆周率:${pi},是否为学生:${isStudent}`);
}
/**
* 测试数字类型(number)的声明与使用
*/
export function testNumberType(): void {
let age: number = 20;
let height: number = 1.75;
let temperature: number = -5;
const PI: number = 3.1415926;
let scientificNum: number = 1.23e5;
console.log(`\n【数字类型】年龄:${age}`);
console.log(`【数字类型】身高:${height}米`);
console.log(`【数字类型】温度:${temperature}℃`);
console.log(`【数字类型】圆周率:${PI}`);
console.log(`【数字类型】科学计数法:${scientificNum}`);
}
/**
* 测试字符串类型(string)的声明与使用,包含模板字符串特性
*/
export function testStringType(): void {
let age: number = 20;
let userName: string = "张三";
let message: string = 'Hello ArkTS';
let emptyStr: string = "";
let firstName: string = "张";
let lastName: string = "三";
let fullName: string = `${firstName}${lastName}`;
console.log(`\n【字符串类型】拼接姓名:${fullName}`);
let intro: string = `我叫${fullName},今年${age}岁`;
console.log(`【字符串类型】个人介绍:${intro}`);
let multiLine: string = `
第一行内容
第二行内容
第三行内容
`.trim();
console.log(`【字符串类型】多行文本(模板写法):\n${multiLine}`);
let multiLine1: string = "第一行\n第二行\n第三行";
console.log(`【字符串类型】多行文本(\\n写法):\n${multiLine1}`);
}
/**
* 测试布尔类型(boolean)的声明与使用
*/
export function testBooleanType(): void {
let isStudent: boolean = true;
let hasPermission: boolean = false;
let isPass: boolean = true;
let isAdult: boolean = false;
console.log(`\n【布尔类型】是否为学生:${isStudent}`);
console.log(`【布尔类型】是否有权限:${hasPermission}`);
console.log(`【布尔类型】是否及格:${isPass}`);
console.log(`【布尔类型】是否成年:${isAdult}`);
}
/**
* 测试空值类型(null/undefined)与联合类型的使用规则
*/
export function testNullUndefinedAndUnionType(): void {
let emptyVar: null = null;
let unassignedVar: undefined = undefined;
console.log(`【空值单独声明】emptyVar: ${emptyVar}, unassignedVar: ${unassignedVar}`);
let userAvatar: string | null = "https://example.com/avatar.jpg";
console.log(`\n【联合类型】用户头像:${userAvatar}`);
userAvatar = null;
console.log(`【联合类型】用户头像(删除后):${userAvatar}`);
let examScore: number | undefined = 95;
console.log(`【联合类型】考试分数:${examScore}`);
examScore = undefined;
console.log(`【联合类型】考试分数(未考试):${examScore}`);
let isVip: boolean | null | undefined = true;
console.log(`【联合类型】是否为VIP:${isVip}`);
isVip = null;
console.log(`【联合类型】是否为VIP(未知):${isVip}`);
isVip = undefined;
console.log(`【联合类型】是否为VIP(未初始化):${isVip}`);
let productStock = 100;
console.log(`【类型推断】商品库存:${productStock}`);
let productStock2: number | null = 50;
}
/**
* 演示注释规范:单行注释、多行/文档注释的使用规则
*/
export function testCommentSpecification(): void {
let commentDemo: string = "注释示例";
console.log(`\n【注释示例】${commentDemo}`);
}
步骤 3:在 Index 中导入并调用函数
迁移函数后Index.ets调用函数会提示“找不到”,导入即可解决(推荐快捷键方式):

方法 1:快捷键自动导入(最快捷)
- 鼠标放在报错的函数名上;
- Mac:
Option + Enter - Windows:
Alt + Enter;
- 选择
Add import from "../utils/VariableType",IDE自动补全导入代码。
方法 2:手动导入(清晰可控)
在Index.ets顶部手动添加导入代码:
完整代码:pages/Index.ets
import {
testBooleanType,
testCommentSpecification,
testNullUndefinedAndUnionType,
testNumberType,
testStringType,
testVariableDeclaration
} from '../utils/VariableType';
// 组件定义
@Entry
@Component
struct Index {
// 统一调用所有测试函数
aboutToAppear(): void {
testVariableDeclaration();
testNumberType();
testStringType();
testBooleanType();
testNullUndefinedAndUnionType();
testCommentSpecification();
}
build() {
Column() {
Text("ArkTS变量与基本类型")
.fontSize(30)
.fontWeight(FontWeight.Bold)
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center);
}
}
十、内容总结
- 基础语法:
let(可变)/const(只读)是核心变量声明方式,ArkTS支持类型推断,number/string/boolean是三大基础类型,字符串推荐用模板字符串。禁用var/any/unknown。 - 关键规则:
null/undefined需结合联合类型使用,布尔值不能用0/1替代,强类型约束是ArkTS核心特点。 - 编码习惯:命名遵循小驼峰规范、注释简洁有意义、日志输出带模块标识,拆分文件让UI与业务逻辑分离(仅为结构清晰)。
十一、代码仓库
- 工程名称:VariableTypeDemo
- 仓库地址:https://gitee.com/juhetianxia321/harmony-os-code-base.git
十二、下节预告
下一节学习核心运算符与运算规则 重点掌握:
- 算术/比较/逻辑/赋值/三元运算符的语法与实战
==与===、||与??的核心差异,避开类型转换坑- 逻辑运算符短路特性、自增/自减前置/后置区别
- 运算优先级与“括号优先”规则,确保表达式结果正确
- 强类型环境下的运算符使用规范

浙公网安备 33010602011771号