期末考试复习总结-《ArkTS基础语法(上)》
一、知识点总结
1. ArkTS语言核心特性
- 定位:专为移动设备设计的高性能编程语言,继承TypeScript语法并优化运行效率,减少动态类型开销。
- 兼容性:与JavaScript无缝互通,支持TypeScript开发者平滑过渡。
2. 基础语法要素
- 变量与常量:
let
声明可变变量,const
声明只读常量,支持类型推断(如let hi2 = 'hello'
自动推断为string)。- 所有字段必须在声明或构造函数中初始化,避免
undefined
。
- 数据类型:
- 基础类型:
number
(含大整数bigInt
)、boolean
、string
、void
、Object
。 - 复合类型:
array
(如string[]
)、enum
(枚举)、Union
(联合类型,如Cat | Dog
)、Aliases
(类型别名)。
- 基础类型:
- 运算符:
- 赋值运算符(
=
、+=
)、比较运算符(===
、>
)、逻辑运算符(&&
、||
)。
- 赋值运算符(
3. 语句与控制流
- 条件语句:
if-else
、switch
(需break
终止分支)。 - 循环语句:
for
、for-of
(遍历数组/字符串)、while
、do-while
。 - 异常处理:
try-catch-finally
,支持自定义错误类型。
4. 函数编程
- 函数声明:需显式标注参数类型,返回类型可推断(如
function add(x: string, y: string): string
)。 - 参数特性:
- 可选参数:通过
?
或默认值实现(如function hello(name?: string)
)。 - Rest参数:
...numbers: number[]
接收不定长参数。
- 可选参数:通过
- 函数式特性:
- 箭头函数:简洁语法(如
(x: number, y: number) => x + y
),隐式返回表达式。 - 闭包:函数与声明环境组合,保留变量状态(如计数器闭包)。
- 箭头函数:简洁语法(如
- 重载:同名函数不同参数签名,需匹配调用类型。
5. 面向对象编程
- 类的定义:
- 字段初始化:
name: string = ''
,构造函数需调用父类super()
。 - 访问修饰符:
public
(公有)、private
(私有)、protected
(受保护,子类可访问)。
- 字段初始化:
- 继承与多态:
- 类通过
extends
继承父类,implements
实现接口。 - 抽象类:含
abstract
方法,不可实例化,子类必须实现抽象方法。
- 类通过
- 接口:定义行为契约,类需实现接口所有方法。
6. 泛型编程
- 泛型类/接口:参数化类型(如
class CustomStack<Element>
),确保类型安全。 - 泛型约束:限制类型参数(如
Key extends Hashable
),确保具备特定方法。 - 泛型函数:支持类型推断(如
function last<T>(x: T[]): T
)。
7. 空安全机制
- 非空断言:
!
断言变量非空(如a!.value
),运行时为空抛异常。 - 空值合并:
??
运算符(如this.nick ?? ''
)。 - 可选链:
?.
安全访问属性(如this.spouse?.nick
)。
8. 模块系统
- 导出与导入:
- 静态导入:
import { X, Y } from './module'
或import * as mod from './module'
。 - 动态导入:
import('./module').then()
,按需加载。
- 静态导入:
- HarmonyOS SDK导入:
- 方式:
import UIAbility from '@ohos.app.ability.UIAbility'
或import { UIAbility } from '@kit.AbilityKit'
。
- 方式:
二、思维导图
三、模拟考试题
1. 单选题(10题×3分=30分)
-
ArkTS的设计核心是( )
A. 兼容Java
B. 移动设备高性能
C. 纯函数式编程
D. 动态类型优先
答案:B -
以下属于ArkTS复合类型的是( )
A. number
B. Union
C. boolean
D. void
答案:B -
函数中用于接收不定长参数的是( )
A. 可选参数
B. Rest参数
C. 必选参数
D. 默认参数
答案:B -
类中只能在自身及子类访问的修饰符是( )
A. public
B. private
C. protected
D. internal
答案:C -
泛型约束使用的关键字是( )
A. extends
B. implements
C. interface
D. class
答案:A -
空值合并运算符是( )
A. ??
B. ?.
C. !
D. ||
答案:A空值合并运算符(??)是用于处理可能为 null 或 undefined 的值,当左侧操作数为 null 或 undefined 时,返回右侧操作数,否则返回左侧操作数。例如,在 JavaScript 中,let result = a ?? b;,如果 a 是 null 或 undefined,result 就等于 b。其他选项,如?.是可选链操作符,用于安全地访问对象的属性,避免因对象为 null 或 undefined 而导致错误;!是逻辑非运算符;||是逻辑或运算符,虽然也能在一定程度上实现类似空值合并的功能,但它会在左侧操作数为 falsy 值(如 false、0、“”、null、undefined 等)时返回右侧操作数,而空值合并运算符只在左侧操作数为 null 或 undefined 时才返回右侧操作数。
-
以下关于ArkTS变量声明正确的是( )
A.let x;
B.const y: number = 10;
C.var z: string = 'abc';
D.let a: boolean;
答案:B在 ArkTS(Ark TS 这里可能是鸿蒙操作系统相关的一种编程语言)中,对于变量声明:
- 变量声明需要指定类型。选项 Alet x;没有指定类型,虽然在一些动态类型语言中这是允许的,但在有强类型要求的场景(如 ArkTS)中可能不符合要求。
- 选项 B const y: number = 10;是正确的,它使用 const 关键字声明了一个常量 y,类型是 number,并且正确地初始化了它的值为 10。
- 选项 C var z: string = ‘abc’;虽然指定了类型,但在ArkTS中通常更倾向于使用 let 或 const 而不是 var 来声明变量,因为 var 有更复杂的作用域规则(函数作用域)。
- 选项 D let a: boolean;只是声明了一个变量 a,类型是 boolean,但没有进行初始化,在需要变量有初始值的场景下这可能不符合要求。而选项 B 既正确声明了变量类型,又进行了正确的初始化。
-
箭头函数的正确写法是( )
A.function(x: number) => x+1
B.(x: number): number = x+1
C.(x: number) => { return x+1; }
D.x => return x+1
答案:C
- 选项 A. function(x: number) => x+1
解析:错误。这个写法混合了传统的函数声明语法(function 关键字)和箭头函数的语法(=>),这是不正确的。箭头函数不需要 function 关键字。- 选项 B. (x: number): number = x+1
解析:错误。这个写法缺少箭头函数的关键部分,即箭头(=>)。正确的箭头函数需要使用 => 来分隔参数和函数体。- 选项 C. (x: number) => { return x+1; }
解析:正确。这是一个标准的箭头函数写法。它包含参数列表 (x: number)、箭头 => 以及用大括号包裹的函数体 { return x+1; }。这种写法清晰且符合箭头函数的语法规范。- 选项 D. x => return x+1
解析:错误。虽然这个写法看起来简洁,但多了一个 return 关键字。在箭头函数中,如果函数体是一个简单的表达式,可以直接写成 x => x+1,而不需要显式使用 return。如果使用大括号包裹函数体,则需要 return,如选项 C 所示。
-
抽象类的特点是( )
A. 可直接实例化
B. 包含抽象方法
C. 不能被继承
D. 无构造函数
答案:B -
动态导入模块的返回值类型是( )
A. Promise
B. Module
C. Object
D. void
答案:A
2. 判断题(10题×1分=10分)
-
ArkTS变量必须显式声明类型。( )
答案:×(可类型推断) -
const
声明的常量可在运行时修改。( )
答案:×(只读) -
接口可以包含方法实现。( )
答案:×(仅声明) -
泛型函数必须显式指定类型实参。( )
答案:×(可推断) -
?.
是可选链运算符,用于安全访问属性。( )
答案:√ -
抽象类的子类必须实现所有抽象方法。( )
答案:√ -
ArkTS不支持闭包特性。( )
答案:×(支持) -
模块中未导出的声明不可被外部访问。( )
答案:√ -
void
类型函数必须返回null
。( )
答案:×(无返回值) -
类的静态方法中可以使用
this
关键字。( )
答案:×(仅限实例方法)
3. 简答题(4题×5分=20分)
-
简述ArkTS与TypeScript的主要区别。
参考答案:- ArkTS专为移动设备设计,优化运行效率,对TypeScript动态类型施加严格限制;
- 支持与JavaScript无缝互通,TypeScript开发者可平滑过渡;
- 所有字段必须初始化,空安全规则更严格。
-
说明
@State
装饰器的作用(结合文档内容)。
参考答案:@State
用于声明状态变量,其值变化时触发UI自动刷新;- 在ArkUI中,状态变量通过
build()
函数声明式驱动UI更新,是声明式UI的核心机制。
-
接口与抽象类的主要区别是什么?
参考答案:- 接口仅声明行为契约,无方法实现;抽象类可包含具体方法和抽象方法;
- 类只能继承一个抽象类,但可实现多个接口;
- 抽象类可包含构造函数,接口不可。
-
简述ArkTS空安全机制的三种核心操作。
参考答案:- 非空断言(!):强制转换可空类型为非空,运行时若为空抛异常;
- 空值合并(??):左侧为
null/undefined
时取右侧值; - 可选链(?.):安全访问嵌套属性,避免空指针异常。
在编程语言中,尤其是支持空安全(null safety)机制的语言(如ArkTS),提供了一些操作符来安全地处理可能为
null
或undefined
的值,以下是对ArkTS中三种核心空安全操作的更详细解析:
- 非空断言(!)
- 用途:用于强制将一个可空类型(nullable type)转换为非空类型(non-nullable type)。这通常用于开发者确定某个值在运行时不会为
null
或undefined
的场景。- 示例:
let x: string | null = null; let y: string = x!;
(这里假设开发者确信x
在运行时不会为null
)- 风险:如果被断言的值实际上为
null
或undefined
,程序在运行时会抛出异常。因此,非空断言应谨慎使用,仅在开发者有充分理由确信值非空时使用。
- 空值合并(??)
- 用途:提供了一种简便的方式为可能为
null
或undefined
的值指定一个默认值。如果左侧操作数不为null
或undefined
,则结果为左侧值;否则,结果为右侧值。- 示例:
let result = x ?? 'default';
(如果x
是null
或undefined
,result
将取值为'default'
)- 优势:可以避免冗长的条件判断,使代码更简洁易读,同时有效处理空值场景。
- 可选链(?.)
- 用途:用于安全地访问对象的嵌套属性或调用方法,防止因链中的某个对象为
null
或undefined
而导致的空指针异常。- 示例:
let value = obj?.prop?.subProp;
(如果obj
或obj.prop
为null
或undefined
,整个表达式的结果将是undefined
,而不会抛出异常)- 优势:简化了嵌套属性的访问逻辑,避免了多层
if
判断,使代码更简洁且更易维护。
4. 程序填空题(2题×10分=20分)
题目1:补全泛型函数,返回数组最后一个元素。
function last<T>(arr: T[]): T {return arr[______]; // 补全索引
}
答案:arr.length - 1
题目2:补全类的构造函数,初始化name
和age
字段。
class Person {name: string = '';age: number = 0;constructor(n: string, a: number) {this.name = n;______; // 补全age初始化}
}
答案:this.age = a
5. 编程题(2题×10分=20分)
题目1:编写一个箭头函数,接收两个数字参数,返回它们的和,并推断返回类型。
参考代码:
let sum = (x: number, y: number) => x + y; // 隐式返回,类型推断为number
题目2:创建一个泛型类Stack
,实现压栈和弹栈功能。
参考代码:
class Stack<T> {private items: T[] = [];push(item: T): void {this.items.push(item);}pop(): T | undefined {return this.items.pop();}
}
// 使用示例
let stringStack = new Stack<string>();
stringStack.push('Hello');
评分要点:泛型类定义(<T>
)、类型安全操作、方法实现。