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

鸿蒙学习地址

posted @ 2025-10-29 14:37  leon_teacher  阅读(26)  评论(0)    收藏  举报