零基础鸿蒙应用开发第三节:变量与基本数据类型

零基础鸿蒙应用开发学习计划表
作为初学者,首先需要掌握的就是变量声明基本数据类型——这是编写所有代码的基础。本节将带你从零开始,系统学习这些核心知识点,同时养成符合鸿蒙开发规范的编码习惯。

【学习目标】

  1. 理解变量概念,掌握 letconst 的核心区别,熟悉ArkTS的类型推断特性
  2. 掌握三大常用基本数据类型(numberstringboolean)的声明方式
  3. 掌握模板字符串实现日志输出的基础技巧,提升代码可读性
  4. 掌握单行注释和多行注释的书写规范,养成良好的编码习惯
  5. 理解空值类型(null/undefined)的含义,结合联合类型使用
  6. 掌握联合类型的基本语法,能结合空值实现业务场景的类型定义(如“字符串或空值”)
  7. 掌握ArkTS核心命名规范(变量/常量),符合鸿蒙官方编码标准

【学习重点】

  1. 命名规范:变量/常量的命名规则,见名知意、符合鸿蒙官方标准
  2. 变量声明let 用于可修改变量,const 用于只读变量;
  3. 数据类型number/string/boolean 的声明语法与基础展示
  4. 实用技巧:模板字符串的变量插值与多行文本基础用法
  5. 避坑要点const 变量不可修改引用;强类型下的变量赋值规范
  6. 空值与联合类型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               # 第三方依赖包目录

开发准备步骤

  1. 打开DevEco Studio,创建VariableTypeDemo项目(选择Empty Ability模板)
  2. 初始阶段我们将学习内容放在Index.etsstruct外部,后续会拆分到独立文件(仅为代码结构清晰);所有函数统一在aboutToAppear生命周期方法中调用(组件渲染前的初始化逻辑)

VariableTypeDemo

二、变量声明(letconst

在ArkTS中,变量声明使用letconst。不支持使用var声明类型,不支持使用anyunknown做变量类型(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 查看运行

  1. 选择Previewer查看UI预览
  2. 打开Log面板查看日志输出(底部导航栏Log选项)
  3. 选择手机设备(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 核心说明

  • 布尔类型仅用于表示“是否”类的状态(如是否为学生、是否有权限)
  • 赋值只能是truefalse,不能是其他值(如10,这是和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中,nullundefined单独使用无意义,必须结合联合类型——这是初学者容易踩坑的点,一定要注意。

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 核心原则

  • 见名知意:名称直接体现变量/函数用途,禁止无意义命名(如afunc1temp
  • 统一风格:全程使用英文,不推荐用拼音、中文、下划线(_
  • 区分场景:
    • 变量/函数/局部常量:小驼峰命名法(lowerCamelCase),首字母小写,后续单词首字母大写(如userNametestStringTypepi
    • 全局常量(文件级):全大写+下划线(UPPER_SNAKE_CASE),如const MAX_AGE: number = 120;
  • 禁止以数字开头,禁止包含特殊符号(如@、空格)
  • 以字母或下划线开头,后续可为字母、数字、下划线 如 _price(通常不使用下划线开头,特殊情况下会使用,后续在讲类的属性会讲到)
  • 禁止使用系统关键词(如let、const、if)

九、完整代码整合

随着功能函数增多,Index.ets会变得臃肿,我们将业务逻辑函数拆分到独立文件,让Index.ets只专注UI相关工作(仅为代码结构清晰):

步骤 1:创建工具文件夹和文件

  1. 找到项目src/main/ets目录,右键选择New -> Directory,创建utils文件夹(存放通用函数);
  2. 选中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:快捷键自动导入(最快捷)

  1. 鼠标放在报错的函数名上;
  • Mac:Option + Enter
  • Windows:Alt + Enter
  1. 选择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);
  }
}

十、内容总结

  1. 基础语法let(可变)/const(只读)是核心变量声明方式,ArkTS支持类型推断,number/string/boolean是三大基础类型,字符串推荐用模板字符串。禁用var/any/unknown
  2. 关键规则null/undefined需结合联合类型使用,布尔值不能用0/1替代,强类型约束是ArkTS核心特点。
  3. 编码习惯:命名遵循小驼峰规范、注释简洁有意义、日志输出带模块标识,拆分文件让UI与业务逻辑分离(仅为结构清晰)。

十一、代码仓库

十二、下节预告

下一节学习核心运算符与运算规则 重点掌握:

  1. 算术/比较/逻辑/赋值/三元运算符的语法与实战
  2. =====||??的核心差异,避开类型转换坑
  3. 逻辑运算符短路特性、自增/自减前置/后置区别
  4. 运算优先级与“括号优先”规则,确保表达式结果正确
  5. 强类型环境下的运算符使用规范
posted @ 2026-01-14 11:59  鸿蒙-散修  阅读(0)  评论(0)    收藏  举报