ArkTS对象类型

  1. 键值对结构
    对象类型由多个属性(property) 组成,每个属性包含,键通常是字符串(或标识符),值可以是任意 ArkTS 类型(如基本类型、其他对象、数组、函数等)。,在声明对象类型之前需要使用interface来约束对象

    // 定义一个描述用户对象的接口
    interface User = { name: string; age: number; isStudent: boolean; hobbies: string[]; // 数组类型 };
  2. 类型注解与实例化
    实例化对象时,需遵循定义的结构(属性名和类型需匹配),属性名顺序可更改,。
    let user:User = { name: 'Bob'; age: 19 ;hobbies:['运动','游戏'] }; // 正确实例化:符合User类型结构
    const user1: User = { name: "Alice", age: 20 }; //错误,需要包含所有必选的属性
  3. 可选属性
    在属性名后加?,表示该属性为可选(可存在或不存在)。

    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;
}

这里的ab就像快递单上的 “物品 1”“物品 2”,只是告诉我们需要两个数字才能计算,但现在还不知道具体是哪两个数。

2. 实参(实际参数)—— 函数调用时的 “具体值”

就像你填写快递单时,在 “收件人姓名” 栏写的 “张三”,“电话” 栏写的 “138xxxx1234”:

  • 它们是调用函数时实际传给函数的值,是具体的、有实际意义的数据
  • 作用是给形参赋值,让函数能真正运行起来

例子
调用上面的add函数:

let result = add(3, 5);  // 这里的3和5就是实参

调用时传入的35就是实参,它们会分别 “填” 到形参ab的位置上,让函数算出结果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...)

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐