赞
踩
ArkTS 是 HarmonyOS 的主要开发语言。它在 TypeScript 的基础上进行了优化和扩展,保留了 TypeScript 的优点,同时屏蔽了其缺点,并与 ArkUI 框架一起构建了鸿蒙应用。本文将介绍 ArkTS 的相关内容。
ArkTS 的设计初衷是提高开发效率、代码质量和性能,因此需要满足以下需求:
基于上述需求,ArkTS 强制使用静态类型。这意味着在 ArkTS 中,声明变量、函数参数和返回值时必须指定类型,并在编译时进行严格的类型检查。由于所有类型在程序运行前都是已知的,开发人员可以更容易地理解代码中的数据结构,编译器也能提前验证代码的正确性,从而减少运行时的类型检查,提高性能。
通过强制使用静态类型,ArkTS 提供了更强大的类型约束和类型推断功能,有助于在编译时捕获潜在的类型错误,提高代码的可靠性和可维护性。这种设计使得开发者能够编写更加健壮和可靠的代码。
如果不使用静态类型,可能会导致以下问题:
因此,ArkTS 在 TypeScript 的基础上进一步完善了语言缺陷,提高了性能和代码可读性。后续文章将详细分析 ArkTS 是如何屏蔽 TypeScript 的缺陷的。
由于官网对 ArkTS 的讲解较少,而 ArkTS 是开发鸿蒙应用的关键,因此我会在几篇文章中详细分析 ArkTS 的核心知识点。本文主要介绍 ArkTS 的基础知识。
在 ArkTS 中,使用 let
和 const
来声明变量。它们有一些相同和不同之处。
let
和 const
的不同之处let
声明的变量是可变的,可以被再次赋值,而 const
声明的常量是不可变的,初始化后值不能被改变。
- function getData() {
- let name = "ByteCode";
- name = "DHL"; // ok
-
- const age = 18;
- age = 20; // 错误:Cannot assign to 'age' because it is a constant.
- }
上面的代码中,尝试修改常量 age
的值时,编译器会提示错误,因为 age
是常量,不能被修改。
实际上,const
修饰的变量的值不能被改变,是指变量指向的内存地址所保存的数据不能改变。
对于基本数据类型(数值、字符串、布尔值等),变量指向的内存地址保存的是变量的值,因此初始化后不能被改变。
const number = 1;
上述代码中,number
指向的内存地址保存的是 number
初始化的值,因此 number
被声明后不能被改变。
对于复杂数据类型(对象和数组),变量指向的是内存地址,保存的是指向实际数据的指针,因此 const
只能保证内存地址保存的指针不能被改变,而它指向的实际数据是可以改变的。
- const language: string[] = ['ArkTs', 'Java', 'Kotlin'];
- language[0] = "ByteCode"; // ok
-
- const people: string[] = ['zhangsan', 'xiaohong', 'xiaoming'];
- language = people; // 错误
我们可以通过索引修改数组 language
,但是不能将 language
指向另一个常量 people
,否则会报错。
let
和 const
的相同之处let
和 const
的作用域相同,都是在声明所在的块级作用域内有效。
- if (true) {
- let age = 18; // age 只在 if 语句内有效
- }
-
- if (true) {
- const name = "DHL"; // name 只在 if 语句内有效
- }
-
- try {
- //
- } catch (e) {
- // 变量 e 只能在 catch 范围内
- }
无论是 let
还是 const
只能在它声明所在的代码块内有效,只不过使用场景不同,比如在 for
循环中,循环变量只能使用 let
声明。
- for (let i = 0; i < 10; i++) {
- // ...
- }
在上面的代码中,循环变量 i
只在 for
循环体内有效,在循环体外引用就会报错。不过在 ArkTS 中不能使用 for .. in
,否则会有编译警告。
这是因为在 ArkTS 中,对象的布局在编译时是确定的,且不能在程序执行期间更改对象的布局。修改对象布局会影响代码的可读性和运行时性能。
- typescriptfor (let i = 0; i < 3; i++) {
- let i = 'abc';
- console.log(i);
- }
以上代码可以正常运行,输出了 3 个 abc
,这说明 for
循环内部声明的变量 i
和循环变量 i
不在同一个作用域,它们各自有独立的作用域。
如果在同一个作用域中,不能使用 let
或 const
重复声明相同名字的变量,例如:
- if(true){
- let a = 1;
- let a = 2; // 报错
-
- const b = 3;
- const b = 4; // 报错
- }
ArkTS 支持与 TypeScript 几乎相同的数据类型,如布尔型、数字、字符串、数组和枚举等。
- let isDone: boolean = false;
- const isDone: boolean = false;
所有数字都是浮点数,类型为 number
。
- let decLiteral: number = 6;
- let hexLiteral: number = 0xf00d;
- const binaryLiteral: number = 0b1010;
- const octalLiteral: number = 0o744;
用 string
表示字符串类型,可以使用双引号(")或单引号(')声明字符串。
- let name: string = "DHL";
- const publicName: string = "ByteCode";
可以使用模板字符串,这种字符串用反引号包围,并以 ${expr}
形式嵌入表达式。
- let name = "DHL";
- const content = `My name is ${name}`;
在 ArkTS 中有两种方式创建数组:
[]
let list: number[] = [1, 2, 3];
Array<元素类型>
let list: Array<number> = [1, 2, 3];
需要注意的是,如果可以从传递给泛型函数的参数中推断出具体类型,ArkTS 允许省略泛型类型实参。否则,需要指定泛型类型实参,否则会报错。
用 enum
表示枚举类型。
- export enum ResponseCode {
- SUCCESS = 1000,
- FAILED = 2000
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。