ArkTS对象类型及函数
ArkTS中的对象类型通过interface定义键值对结构,属性可设为可选。函数封装可复用代码块,支持参数传递(形参与实参)和递归调用。代码示例展示了用户登录逻辑,包括对象实例化、函数调用和条件跳转。函数作用域限制内部访问,但可通过变量赋值或返回值实现外部调用。递归函数需满足终止条件和参数递进条件,如计算斐波那契数列。
ArkTS对象类型
- 键值对结构
对象类型由多个属性(property) 组成,每个属性包含键和值,键通常是字符串(或标识符),值可以是任意 ArkTS 类型(如基本类型、其他对象、数组、函数等)。,在声明对象类型之前需要使用interface来约束对象// 定义一个描述用户对象的接口interface User = { name: string; age: number; isStudent: boolean; hobbies: string[]; // 数组类型 }; - 类型注解与实例化
实例化对象时,需遵循定义的结构(属性名和类型需匹配),属性名顺序可更改,。let user:User = { name: 'Bob'; age: 19 ;hobbies:['运动','游戏'] }; // 正确实例化:符合User类型结构const user1: User = { name: "Alice", age: 20 }; //错误,需要包含所有必选的属性 - 可选属性
在属性名后加?,表示该属性为可选(可存在或不存在)。let book:Book = { title: string; author: string; price?: number; // 可选属性,可省略 }; const book1: Book = { title: "鸿蒙开发", author: "开发者" }; // 合法,缺少price const book2: Book = { title: "ArkTS指南", author: "团队", price: 59 }; // 合法
import { router } from '@kit.ArkUI';
interface User{ //定义用户接口
id:string,
password:string
}
@Entry
@Component
struct TestObject {
@State message: string = 'Hello World';
@State ff:User={ //将对象实例化
id:'123',
password : '234'
}
build() {
Column() {
TextInput({placeholder:'id'})
.onChange((value)=>{ // 获取输入的id,把结果赋给ff变量的id属性
this.ff.id = value
})
TextInput({placeholder:'password'})
.type(InputType.Password)
.onChange((value)=>{ // 获取输入的password,把结果赋给ff变量的password属性
this.ff.password = value
})
Button('login').onClick((event: ClickEvent) => {
if(this.ff.id == '22' && this.ff.password == '123'){
AlertDialog.show({ // 如果id为'22'并且password为123,显示弹窗登陆成功
message:'log success'
})
router.pushUrl({
url:'pages/day03/ginshenmodel' //跳转页面,需要使用resources/profile/main_page.json里的路径
})
}else{
AlertDialog.show({
message:'log failed'
})
}
})
}
.height('100%')
.width('100%')
}
}
函数的作用、封装及调用
函数就是一段可重复使用的代码块,用来完成特定功能。比如计算两个数的和、验证手机号格式等,都可以封装成函数,需要时直接调用,不用重复写代码。
函数封装
//声明式
function 变量名/函数名() {
// 相当于定义一个变量,函数名就是变量名 数据不是原始类型,而是function
// 公共代码
}
//赋值式
let 变量名/函数名:Function = () => {
// 公共代码
}
let 变量名/函数名 = () => {
// 公共代码
}
函数调用
//声明式可以在任意位置调用,程序会预加载函数
// 先调用
fn()
// 定义函数
function fn() {
console.log("声明式")
}
// 后调用
fn()
//赋值式只能在封装后调用
fn() // 不行报错
// 定义函数fn 输出双击666
var fn = function() {
console.log("双击666")
}
// 调用
fn()
fn()
函数的参数
1. 形参(形式参数)—— 函数定义时的 “占位符”
就像快递单上的 “收件人姓名”“电话”“地址” 这几个空栏位:
- 它们是函数定义时写在括号里的变量,只是先占个位置,没有具体值
- 作用是告诉别人:“调用我这个函数时,需要给我这些类型的信息”
例子:
定义一个计算两数之和的函数:
function add(a: number, b: number) { // 这里的a和b就是形参
return a + b;
}
这里的a和b就像快递单上的 “物品 1”“物品 2”,只是告诉我们需要两个数字才能计算,但现在还不知道具体是哪两个数。
2. 实参(实际参数)—— 函数调用时的 “具体值”
就像你填写快递单时,在 “收件人姓名” 栏写的 “张三”,“电话” 栏写的 “138xxxx1234”:
- 它们是调用函数时实际传给函数的值,是具体的、有实际意义的数据
- 作用是给形参赋值,让函数能真正运行起来
例子:
调用上面的add函数:
let result = add(3, 5); // 这里的3和5就是实参
调用时传入的3和5就是实参,它们会分别 “填” 到形参a和b的位置上,让函数算出结果8。
函数的作用域
let f1:Function = ()=>{}
function fun1(){ // fun1作用域开始
console.log('out')
const fun2 = ()=>{ //fun2作用域开始
console.log('in');
const fun3=()=>{ // fun3作用域开始
console.log('inner')
}//fun3作用域作用域结束
f1 = fun3
} // fun2作用域结束
return fun2
} //fun1作用域结束
let f = fun1()
f()
f1()
一般来说函数作用域外无法调用函数里的函数(函数里的函数只能用箭头函数的形式写),有两种方法可以实现在函数外调用
1、先将一个空的函数赋值一个变量,如上面的f1,在调用fun2函数时可以将fun3赋值给f1,然后再调用f1()函数就能实现直接调用fun3函数(其实依然不能直接调用,只是调用与fun3函数相同的f1函数)
2、在执行完函数将返回值设置为函数类型(如上面的fun1函数,在执行完毕后会返回fun2函数),之后再将返回值赋值给一个变量(比如上面的f),调用这个新的函数就能实现函数外调用
函数的递归
递归的定义:函数直接或间接的调用自己
递归函数需要满足两个条件:
- 终止条件:必须有一个停止递归的条件(比如遇到空盒子就停止)
- 递归步骤:函数自己调用自己,但每次调用的参数应该更接近终止条件(比如每次处理更小的盒子)
function fei(num:number):number{
if(num == 1 || num == 2){
return 1
}
return fei(num - 1)+fei(num - 2)
}
用递归实现斐波那契数列
如果调用fei(5),计算过程是这样的:
fei(5) = fei(4) + fei(3)
fei(4) = fei(3) + fei(2) = fei(3) + 1
fei(3) = fei(2) + fei(1) = 1 + 1 = 2
// 回推计算
fei(4) = 2 + 1 = 3
fei(5) = 3 + 2 = 5
最终结果是 5,对应斐波那契数列的第 5 项(1,1,2,3,5...)
更多推荐



所有评论(0)