ArkTS语言(一)
学习ArkTS语言
ArkTS是HarmonyOS的主要应用开发语言,在TypeScript基础上进行了扩展,保留了其基本风格,并通过增强静态检查和分析来提高程序的稳定性和性能。本教程将帮助开发者掌握ArkTS的核心功能、语法及最佳实践,以便高效地构建高性能移动应用。
1. 数据与类型
1.1 字面量
字面量(Literal)是一种直接表示在源代码中的固定值,不同类型的字面量格式有所不同,下面是ArkTS中各类型字面量的表示方式。
● 数值型字面量
○ 整数:数学中的整数(例如:8, 15, 123)
○ 浮点数(浮点型):带有小数点的数字(例如:8.15, 1.234)
● 字符串型字面量:用单引号或双引号括起来的文本(例如:'abc', "你好世界")
● 布尔型字面量:表示真假(例如:true, false)
//1.整数型字面量
console.log('整数:',60); //60
//2.浮点型字面量
console.log('浮点数:',3.14) //3.14
console.log('浮点数:',.14) //0.14
console.log('浮点数:',1e2) //100
//3.布尔型字面量
console.log('布尔型:',true) //true
console.log('布尔型:',false) //false
//4.字符串型字面量
console.log('字符串:','Hello ArkTS') //Hello ArkTS
console.log('字符串:',"Hello HarmonyOS") //Hello HarmonyOS
1.2 变量
在计算机语言中,变量可以理解为存储数据的容器。在ArkTS中定义变量的格式如下。
let 变量名: 类型 = 值
let a:number = 10 //ArkTS

定义各种类型的变量
let title: string = 'HUAWEI Mate 60 Pro'
console.log(title)
1.3 类型
ArkTS是一种静态类型的语言,定义变量时必须明确数据类型。 ArkTS支持的数据类型有以下几种。
string 类型
string 用于表示文本数据,可以包含字母、数字、符号和空格等。可以使用单引号(')、双引号(")或反引号(`)来声明字符串。反引号内可以嵌入表达式,形成模板字符串。
let name: string = 'ArkTS!';
let desc: string = "ArkTS是HarmonyOS的主要应用开发语言"
let templateStr: string = `Hello,${name}. ${desc}`
boolean 类型
boolean 用于表示逻辑上的真值和假值。只有两个值:true 和 false。
let isDone: boolean = false;
array 类型
array即数组,它是一个存储数据的容器,数组的长度由数组中元素的个数来确定。数组中第一个元素的索引为0。
// 0 1 2
let names: string[] = ['Alice', 'Bob', 'Carol'];
names[0] = "爱丽丝"
console.log(names[0]) //"爱丽丝"
enum类型
enum类型,又称枚举类型,是预先定义的一组命名值的值类型,其中命名值又称为枚举常量。
使用枚举常量时必须以枚举类型名称为前缀。
enum ColorSet {
Red,
Green,
Blue
}
let c: ColorSet = ColorSet.Red;
常量表达式可以用于显式设置枚举常量的值。
enum Colors {
White = 0xFF,
Grey = 0x7F,
Black = 0x00
}
let c: ColorSet = ColorSet.Black;
union类型
union类型,即联合类型,是由多个类型组合成的引用类型。联合类型可以包含了变量可能的所有类型
let a1: string | number | ColorSet | string[] | ColorSet[] = "red" //正确
let a2: string | number | ColorSet | string[] | ColorSet[] = 0xff00 //正确
let a6: string | number | ColorSet | string[] | ColorSet[] = true //错误
Aliases类型
Aliases类型为别名类型,可以为已有类型提供替代名称,或者为匿名类型(数组、函数、对象字面量或联合类型)提供名称。
// 为number类型取一个别名为int
type int = number
let a: number = 10
let b: int = 10
// 定义Type为联合类型
type Type = string | number | ColorSet | string[] | ColorSet[]
let a7:Type = "黄色"
1.4 常量
常量是不会发生改变的数据,它只能被赋值一次。定义格式如下
const 常量名: 类型 = 值
例:在数学中有一个非常重要的常量,就是圆周率π
const PI: number = 3.1415926
PI = 31.4 //这是错误的,变量的值只能被赋值一次。
1.5 类型推断
由于ArkTS是一种静态类型语言,所有数据的类型都必须在编译时确定。但是,如果一个变量或常量的声明包含了初始值,那么开发者就不需要显式指定其类型。
//以下两种定义变量的方式都可以
let a1: number = 10
let a2 = "abc"
1.6 命名规范
不管定义变量还是定义常量,取名也是不是乱取的,是有一些命名规则的,必须遵守这些规则,否则代码编译不通过。
1. 只能包含数字、字母、下划线、$,不能以数字开头
2. 不能使用内置关键字或者保留字
3. 严格区分大小写
1.7 undefined 空值
先说结论,undefined表示一个变量它的值为“空值”,意思就是这个变量没有值,其它就是undefined。
有下面几种情况,变量的值是undefined.
情况一:变量没有显示的赋值,其值默认就是undefined
变量没有显示的赋值,但是直接使用这个变量是不推荐的,所以编译器会报错。为了验证上面的结论,我们可以使用强制断言符号“!”,强制编译通过。
let a: string
console.info(`${a}`) //编译报错
console.info(`${a!}`) //编译通过,输出undefined
let b: number
console.info(`${b!}`) //编译通过,输出undefined
情况二:变量没有显示赋值,但是明确声明类型可以是undefined,其值默认也是undefined
let a: string | undefined
console.info(`${a}`) //编译通过,输出undefined
let b: number | undefined
console.info(`${b}`) //编译通过,输出undefined
情况三:变量显示赋值为undefined,其类型必须声明为undefined类型
let a: string = undefined //编译错误
let b: string | undefined = undefined
console.info(`${a}`) //编译通过,输出undefined
注意:不管使用哪种形式定义变量,后续都可以按照指定类型更改变量的值
let a: string
let b: number | undefined
let c: boolean | undefined = undefined
console.info(`${a!}`) //输出undefined
console.info(`${b}`) //输出undefined
console.info(`${c}`) //输出undefined
a = 'hello'
b = 20
c = true
console.info(`${a}`) //输出hello
console.info(`${b}`) //输出20
console.info(`${c}`) //输出true
2. 运算符
运算符(Operator)是一种告诉编译器执行特定数学或逻辑操作的符号。任何一门计算机语言运算操作基本上是一样的。
2.1 算术运算符
所有算术运算符如下表所示

以上运算符都比较简单,下面重点讲解一下++或者--运算符的运算规则。
- 单独使用:不断++或者--放在操作数的前面还是后面,都表示对操作数自增1或者自减1
let a = 3
let b = 4
a++
console.log(`a的值为${a}`) // 4
++b;
console.log(`b的值为${b}`) // 5
- 混合使用:++和--可以放在变量前面或者后面,运算顺序有所不同
let x = 3
let y = ++x //x先+1,再把x的结果赋值给y
console.log(`x的值为${x}`) //x的值为4
console.log(`y的值为${y}`) //y的值为4
let i = 3
let j = i++ //先把i的值赋值给j,i再+1
console.log(`i的值为${i}`) //x的值为4
console.log(`j的值为${j}`) //y的值为3
2.2 赋值运算符
赋值运算就是把具体数据值赋值给变量,有下面的几个运算符

let a1 = 10 //把整数10赋值给var类型的变量a
let b1 = 20
b1+=10 //把b1+10之后,把结果再赋值给b,最终b=30
console.log(`b1的值为${b1}`) //b1的值为30
let c1 = 10
c1 %= 4 //把c对4取余数,把结果再赋值给c,最终c=2
console.log(`c1的值为${c1}`) //c1的值为2
2.3 比较运算符
用来对两个数据做比较运算,最终结果只能是true或者false。需要注意的是==和=千万不要搞混淆了
- = 用于赋值
- == 用于判断两个数据是否相等

let a2 = 10
let b2 = 10
let c2 = a2==b2
console.log(`c2的值为${c2}`) //c2的值为true
2.4 逻辑运算符
逻辑运算可以对多个条件进行连接,最终结果也是true或者false

let a3=3;
let b3=4;
let c3=5;
//&&(双与): 左右两边都是true,结果才是true。
console.log('逻辑运算',a3>b3 && b3<c3) //false
console.log('逻辑运算',a3<b3 && b3<c3) //true
//||(双或): 左右两边有一个是true,结果就是true。
console.log('逻辑运算',a3>b3 || b3>c3) //false
console.log('逻辑运算',a3<b3 || b3<c3) //true
//!(非): 对值取反
console.log('逻辑运算',!(a3<b3)) //false
3.流程语句
3.1 if语句
if语句用于需要根据逻辑条件执行不同语句的场景。当逻辑条件为真时,执行对应的一组语句,否则执行另一组语句(如果有的话)。
if语句如下所示:
if (condition1) {
// 语句1
} else if (condition2) {
// 语句2
} else {
// else语句
}
条件表达式可以是任何类型。但是对于boolean以外的类型,会进行隐式类型转换:
let s1:string = "Hello"
if (s1) {
console.log(s1); // 打印“Hello”
}
let s2 = 'World';
if (s2.length != 0) {
console.log(s2); // 打印“World”
}
3.2 switch语句
switch用于在几个固定的值当中,选择一个匹配的值,执行对应的代码块。
switch (expression) {
case label1: // 如果label1匹配,则执行
// ...
// 语句1
// ...
break; // 可省略
case label2:
//语句2
break;
case label3: // 如果label2或label3匹配,则执行
// ...
// 语句23
// ...
break; // 可省略
default:
// 默认语句
}
如果switch表达式的值等于某个label的值,则执行相应的语句。
如果没有任何一个label值与表达式值相匹配,并且switch具有default子句,那么程序会执行default子句对应的代码块。
break语句(可选的)允许跳出switch语句并继续执行switch语句之后的语句。
如果没有break语句,则执行switch中的下一个label对应的代码块。
3.3 三元表达式
条件表达式用于根据条件是true或者false,决定在两个值中选择一个值作为最终结果。
数据类型 变量名 = 条件表达式 ? 值1 : 值2;
- ● 执行流程:
a. 判断关系表达式的结果是true还是false
b. 如果关系表达式是true,三元运算的结果就是表达式1
c. 如果关系表达式是false,三元运算的结果就是表达式2
//例1:求两个变量的最大值
let n = 30;
let m = 20;
//三元运算的结果 被max接收
let max = n > m ? n : m
console.log('三元运算', max) //30
//例2:判断成绩是否及格
let score = 90
console.log('三元运算', score>=60?'及格':'不及格') //及格
3.4 for语句
for语句会被重复执行,直到循环退出语句值为false。for语句如下所示:
for (初始化语句; 条件判断; 变量更新) {
循环体语句
}
示例:打印输出1~10之间所有的整数
for(let i=1; i<=10; i++){
console.log(i)
}
示例:求0~10范围内所有偶数的和
let sum = 0;
for (let i = 0; i <= 10; i+=2) {
sum+=i
}
3.5 for-of语句
使用for-of语句可遍历数组或字符串。示例如下:
for (forVar of expression) {
statements
}
示例:
let array = ['你好', '鸿蒙', 'HarmonyOS'];
for (let s of array) {
console.log(s); //'你好', '鸿蒙', 'HarmonyOS'
}
3.6 while语句
只要condition为真值(转换后为true的值),while语句就会执行statements语句。示例如下:
while (condition) {
statements
}
示例:
let n = 0;
let x = 0;
while (n < 3) {
x += n;
n++;
}
console.log(n)
3.7 do-while语句
如果condition的值为真值(转换后为true的值),那么statements语句会重复执行。示例如下:
do {
statements
} while (condition)
示例:
let sum3 = 0
let i = 0;
do {
sum3 += i
i++
} while (i <= 10)
console.log(sum3) //55
3.8 break语句
使用break语句可以终止循环语句或switch。
示例:
for (let x = 1; x <=10; x++) {
if (x % 2 == 0) {
break
}
console.log(x) //1
}
如果break语句后带有标识符,则将控制流转移到该标识符所包含的语句块之外。
示例:
let x = 1
label: while (true) {
switch (x) {
case 1:
// statements
break label; // 中断while语句
}
}
3.9 continue语句
continue语句会停止当前循环迭代的执行,并继续执行下一次循环。
示例:
for (let x = 1; x <=10; x++) {
if (x % 2 == 0) {
continue
}
console.log(x) //1 3 5 7 9
}
3.10 流程控制练习
//练习一:打印输出1~100中既能被3整除,也能被5整除的数
//练习二:打印输出所有的水仙花数(是一个三位数,每一位数字的立方和等于该数本身)
//比如:153 = 1*1*1 + 5*5*5 + 3*3*3
//练习三:接上练习二,求水仙花数有多少个?,把个数打印
//练习四:假设有一张足够大的纸,请问折叠多少次可以到达珠穆朗玛峰的高度
//练习五:打印4行5列的*矩形图案
//*****
//*****
//*****
//*****
//练习六:打印4行5列的*直角三角形图案
//*
//**
//***
//****
//*****
//练习七:打印9*9的99乘法表
//1*1=1
//1*2=2 2*2=4
//1*3=3 2*3=6 ...
//1*4=4 2*4=8 ...
//1*5=5 2*5=10 ...
//1*6=6 2*6=12 ...
//1*7=7 2*7=14 ...
//1*8=9 2*8=16 ...
//1*9=9 2*9=18 ... ... ... 9*9=81

浙公网安备 33010602011771号