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 变量名: 类型 = 值int a = 10; //Java
let a:number = 10 //ArkTS
例:比如在华为商城中有很多商品,我们现在想定义一个变量,用来存储商品的标题
定义各种类型的变量
let title: string = 'HUAWEI Mate 60 Pro'
console.log(title)
1.3. 类型
ArkTS是一种静态类型的语言,定义变量时必须明确数据类型。 ArkTS支持的数据类型有以下几种
number 类型
number 用于表示数字,包括整数和浮点数。
let num: number = 10;
let floatNum: number = 3.14;
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。
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 ColorSet { White = 0xFF, Grey = 0x7F, Black = 0x00
}
let c: ColorSet = ColorSet.Black;
union类型
union类型,即联合类型,是由多个类型组合成的引用类型。联合类型可以包含了变量可能的所有类型
type Type = string | number | ColorSet | string[] | ColorSet[]let a1: Type = "red" //正确
let a2: Type = 0xff00 //正确
let a3: Type = ColorSet.Red //正确
let a4: Type = ["red", "balck"] //正确
let a5: Type = [ColorSet.Red] //正确
let a6: Type = true //错误
Aliases类型
Aliases类型为别名类型,可以为已有类型提供替代名称,或者为匿名类型(数组、函数、对象字面量或联合类型)提供名称。
// 为number类型取一个别名为int
type int = number
let a: number = 10
let b: int = 10
1.4. 常量
常量是不会发生改变的数据,它只能被赋值一次。定义格式如下
const 变量名: 类型 = 值
例:在数学中有一个非常重要的常量,就是圆周率π
const PI: number = 3.1415926
PI = 31.4 //这是错误的,变量的值只能被赋值一次。
1.5. 类型推断
由于ArkTS是一种静态类型语言,所有数据的类型都必须在编译时确定。但是,如果一个变量或常量的声明包含了初始值,那么开发者就不需要显式指定其类型。
//以下两种定义变量的方式都可以
let a1: number = 10
let a2 = 10
1.6. 命名规范
不管定义变量还是定义常量,取名也是不是乱取的,是有一些命名规则的,必须遵守这些规则,否则代码编译不通过。
1. 只能包含数字、字母、下划线、$,不能以数字开头
2. 不能使用内置关键字或者保留字
3. 严格区分大小写
1.7. undefined 空值
先说结论,undefined表示一个变量它的值为“空值”,意思就是这个变量没有值,其它就是undefined。
有下面几种情况,变量的值是undefined.
情况一:变量没有显示的赋值,其值默认就是undefined
变量没有显示的赋值,但是直接使用这个变量是不推荐的,所以编译器会报错。为了验证上面的结论,我们可以使用强制断言符号“!”,强制编译通过。
let a: string
console.info(`${a}`) //编译报错
console.info(`${a!}`) //编译通过,输出undefinedlet b: number
console.info(`${b!}`) //编译通过,输出undefined
情况二:变量没有显示赋值,但是明确声明类型可以是undefined,其值默认也是undefined
let a: string | undefined
console.info(`${a}`) //编译通过,输出undefinedlet b: number | undefined
console.info(`${b}`) //编译通过,输出undefined
情况三:变量显示赋值为undefined,其类型必须声明为undefined类型
let a: string = undefined //编译错误
let b: string | undefined = undefined
console.info(`${a}`) //编译通过,输出undefined
注意:不管是前面那种情况,在后续代码中都可以给值为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
1.8. 数组
数组是能够存储0个或者多个数据的容器。下面两种格式都可以定义数组
let 数组名: Array<类型> = [值1, 值2, 值3];
let 数组名: 类型[] = [值1,值2,值3]
例:定义一个数组,用来存储班级中学生的姓名
let names1: Array<string> = ['小明','小黄','阿珍','阿强']
let names2: string[] = ['小明','小黄','阿珍','阿强']
例:定义数组也可以使用类型推断,省略数据类型
let names3 = ['小明','小黄','阿珍','阿强']
数组中存储的数据统称为元素,每一个元素都会有一个唯一的索引编号,通过数组名[索引]
就可以找到任意一个元素。
console.log(‘names2[0]’,names2[0]) //小明
names2[1] = ‘大黄’
console.log(‘names2[1]’,names2[1]) //大黄
console.log(‘names2[2]’,names2[2]) //阿珍
console.log(‘names2[3]’,names2[3]) //阿强
1.9. 运算符
运算符(Operator)是一种告诉编译器执行特定数学或逻辑操作的符号。任何一门计算机语言运算操作基本上是一样的。
1.9.1. 算术运算符
所有算术运算符如下表所示
运算符 | 含义 |
+ | 加法运算、字符串拼接 |
- | 减法运算 |
* | 乘法运算 |
/ | 除法运算,整数相除只能得到整数 |
% | 取模(余数) |
++ | 自增运算(在原来数据的基础上+1) |
-- | 自减运算(在原来数据的基础上-1) |
以上运算符都比较简单,下面重点讲解一下++或者--运算符的运算规则。
- 单独使用:不断++或者--放在操作数的前面还是后面,都表示对操作数自增1或者自减1
let x = 3 let y = ++x //a先+1,再把a的结果赋值给b 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
-
let i = 3 let j = i++ //先把i的值赋值给j,i再+1 console.log(`i的值为${i}`) //x的值为4 console.log(`j的值为${j}`) //y的值为3
-
1.9.2. 赋值运算符
赋值运算就是把具体数据值赋值给变量,有下面的几个运算
运算符
含义
=
把右边的值赋值给左边
+=
左右两边相加的结果赋值给左边
-=
左右两边相减的结果赋值给左边
*=
左右两边相乘的结果赋值给左边
/=
左右两边相除的结果赋值给左边
%=
左右两边取余数的结果赋值给左边
-
let a1 = 10 //把整数10赋值给var类型的变量a let b1 = 20 b1 += 10 //把b+10之后,把结果再赋值给b,最终b=30 console.log(`b1的值为${b1}`) //b1的值为30let c1 = 10 c1 %= 4 //把c对4取余数,把结果再赋值给c,最终c=2 console.log(`c1的值为${c1}`) //c1的值为2