当前位置: 首页 > news >正文

【鸿蒙开发】第五章 ArkTS基础知识 - 声明变量、常量、类型和函数

1 前言

前面几个章节我们学习了鸿蒙的简介、鸿蒙应用的开发环境配置、鸿蒙开发学习路线以及目前华为主推的Stage模型下ArkTS开发范式的项目结构,本章节我们来继续学习ArkTS的基础知识。其实官网上的ArkTS语言开发文档有比较详细的说明,所以这里在官方文档的基础上,结合本人的学习经验总结整理,简要的给大家分享一下ArkTS的基础知识供各位参考学习。ArkTS的基础类型和用法和ts的大致基本相同,与Java也极其相似。

在这里插入图片描述

下面我们先来学习ArkTS的声明,ArkTS通过声明引入变量常量类型函数

2 变量与常量

2.1 变量声明

以关键字letvar开头的声明引入变量,该变量在程序执行期间可以具有不同的值。

let name: string = 'yvan'
name = 'my name is yvan'var name: string = 'yvan1'

2.2 常量声明

以关键字const开头的声明引入只读常量,该常量只能被赋值一次。对常量重新赋值会造成编译时错误。

const name: string = 'yvan'

由于ArkTS是一种静态类型语言,所有数据的类型都必须在编译时确定。
但是,如果一个变量或常量的声明包含了初始值,那么开发者就不需要显式指定其类型。ArkTS规范中列举了所有允许自动推断类型的场景,初始值类型即属性类型

let name: string = 'yvan'
let name2 = 'yvan'

3 类型

3.1 Number

ArkTS提供numberNumber类型,任何整数和浮点数都可以被赋给此类型的变量,十六进制(0x)、八进制(0o)、二进制(0b)

// 十六进制
let n1 = -0xF1A7
// 八进制
let n2 = 0o777
// 二进制
let n3 = -0b11
let n4 = 3.141592
let n5 = .5
let n6 = 1e10

3.2 Boolean

truefalse两个逻辑值组成。

let isDone: boolean = false

3.3 String

代表字符序列,可以使用转义字符来表示字符,单引号双引号括起来都可,$在其内为模版字面量。

let a = "Success"
let s1 = 'Hello, world!\n'
let s2 = 'this is a string'
// $引入模版字面量
let s3 = `The result is ${a}`

3.4 Void

用于指定函数没有返回值。 可以用于泛型类型参数

// 函数无返回值
test():void{
}// 泛型类型参数
class Class<T> {
}
let instance: Class <void>

3.5 Object

Object类型是所有引用类型的基类型。任何值,包括基本类型的值(它们会被自动装箱),都可以直接被赋给Object类型的变量。

3.6 Array

array即数组, 数组的长度由数组中元素的个数来确定。数组中第一个元素的索引为0。

let arr: string[] = ['a', 'b', 'c']

3.7 Enum

又称枚举类型,是预先定义的一组命名值的值类型,其中命名值又称为枚举常量。 使用枚举常量时必须以枚举类型名称为前缀。

enum Color { Red, Green, Blue }
let c: Color = Color.Red// 常量表达式可以用于显式设置枚举常量的值。
enum Color { White = 0xFF, Grey = 0x7F, Black = 0x00 }
let c: Color = Color.Black

3.8 Union

联合类型,是由多个类型组合成的引用类型。联合类型包含了变量可能的所有类型。

type UnionType = String | Number | Booleanlet obj : UnionType = Number(111)
obj = "222"
obj = true// 可以用不同的机制获取联合类型中特定类型的值
if (obj instanceof String) {let a : String = obj as Stringhilog.info(0x0000, "yvan", a.valueOf());
}

3.9 Aliases

Aliases类型为匿名类型(数组、函数、对象字面量或联合类型)提供名称,或为已有类型提供替代名称。

type Matrix = number[][]
type Handler = (s: string, no: number) => string
type Predicate <T> = (x: T) => Boolean
type NullableObject = Object | null

4 运算符

运算符没什么特别之处,有赋值运算符比较运算符算术运算符位运算符逻辑运算符,基本用法同Java。这里不多赘述,可查阅文档学习。

5 语句

以下语句也基本同Java的使用,因此可直接看小节总结

5.1 if语句

if语句用于需要根据逻辑条件执行不同语句的场景

if (condition1) {// 语句1
} else if (condition2) {// 语句2
} else {// else语句
}

对于boolean以外的类型,会进行隐式类型转换,null、未赋值、空字符串、0等默认值都为fasle

let s1 = 'Hello'
if (s1) {console.log(s1) // 打印“Hello”
}let s2 = 0
if (s2) {console.log(s2)
}else{console.log("不成立:"+s2) // 打印“不成立:0”
}

5.2 Switch语句

使用switch语句来执行与switch表达式值匹配的代码块。switch表达式的类型必须是numberenumstringlabel必须是常量表达式枚举常量值。没有命中走default,没有写break;继续往下执行。

switch (expression) {case label1: // 如果label1匹配,则执行// 语句1break; // 可省略case label2:case label3: // 如果label2或label3匹配,则执行// 语句23break; // 可省略default:// 默认语句
}

5.3 条件表达式

条件表达式由第一个表达式的布尔值来决定返回其它两个表达式中的哪一个。也可以称作三目运算符

表达式为true->执行:前的结果
表达式为false->执行:后的结果

let isValid = Math.random() > 0.5 ? true : false
let message = isValid ? 'Valid' : 'Failed'

5.4 For语句

for语句会被重复执行,直到循环退出语句值为false,同Java的For使用

let sum = 0
for (let i = 0; i < 10; i += 2) {sum += i
}

使用for-of语句可遍历数组或字符串,类似Java的ForEach语句

let str = 'abcde'
for(let each of str){console.log("each:"+ch) // 输出:a b c d e
}

5.5 While语句

只要while括号中的值为true,while语句就会一直执行语句。同Java的While使用。

let n = 0
let x = 0
while (n < 3) {n++x += n
}

do-while也同Java。

let i = 0
do {i += 1
} while (i < 10)

5.6 Break语句

使用break语句可以终止循环语句switch

let x = 0
while (true) {x++;if (x > 5) {break;}
}// 如果break语句后带有标识符,则将控制流转移到该标识符所包含的语句块之外。
let x = 1
label: while (true) {switch (x) {case 1:// statementsbreak label // 中断while语句}
}

5.7 Continue语句

continue语句会停止当前循环迭代的执行,并将控制传递给下一个迭代。同Java

let sum = 0
for (let x = 0; x < 100; x++) {if (x % 2 == 0) {continue}sum += x
}

5.8 Throw和Try语句、Finally语句

throw语句用于抛出异常或错误
try语句用于捕获和处理异常或错误
finally语句总会执行的代码

以上三个关键词的使用都同Java

throw new Error('this error')try {// 可能发生异常的语句块
} catch (e) {// 异常处理
} finally {// 正常或者异常都会执行的代码
}

5.9 小节总结

语句基本同Java的使用,只有一处与Java稍微有区别:
if语句的条件支持非boolean值,对于boolean以外的类型,会进行隐式类型转换,null、undefined、空字符串、0等默认值都为fasle

6 函数

函数声明引入一个函数,包含其名称参数列表返回类型函数体。在函数声明中,必须为每个参数标记类型。如果参数为可选参数,那么允许在调用函数时省略该参数。函数的最后一个参数可以是rest参数。

add(x: string, y: string): string {let z: string = `${x} ${y}`return z
}

6.1 可选参数

参数名旁使用(?)实现可选参数的功能

    function hello(hello:string = 'Hello', name?: string) {if (name == undefined) {console.log(hello)} else {console.log(hello+", "+name)}}hello(undefined) // 输出:Hellohello(undefined, 'yvan') // 输出:Hello, yvan}

6.2 剩余参数(Reset参数)

剩余参数会被当做个数不限的可选参数。 可以一个都没有,同样也可以有任意个。 可以使用省略号(…) 进行定义:

function add(x: string, ...y: string[]) {return x + y.join();
}let result1 = add("a")
let result1 = add("a","b","c","d")

6.3 返回类型

如果可以从函数体内推断出函数返回类型,则可在函数声明中省略标注返回类型。

// 显式指定返回类型
function foo(): string { return 'foo' }// 推断返回类型为string
function goo() { return 'goo' }// 无返回类型,可写或不写void
function hi1() { console.log('hi') }
function hi2(): void { console.log('hi') }

6.4 函数类型

函数类型通常用于定义回调

type trigFunc = (x: number) => number // 这是一个函数类型function do_action(f: trigFunc) {f(3.141592653589) // 调用函数
}do_action(Math.sin) // 将函数作为参数传入

6.5 箭头函数或Lambda函数

函数可以定义为箭头函数,例如:

let sum = (x: number, y: number): number => {return x + y
}

箭头函数的返回类型可以省略;省略时,返回类型通过函数体推断。
表达式可以指定为箭头函数,使表达更简短,因此以下两种表达方式是等价的:

let sum1 = (x: number, y: number) => { return x + y }
let sum2 = (x: number, y: number) => x + y

6.6 闭包

箭头函数通常在另一个函数中定义。作为内部函数,它可以访问外部函数中定义的所有变量和函数。

为了捕获上下文,内部函数将其环境组合成闭包,以允许内部函数在自身环境之外的访问。

function f(): () => number {let count = 0return (): number => { count++; return count }
}let z = f()
console.log(z()) // 输出:1
console.log(z()) // 输出:2

在以上示例中,箭头函数闭包捕获count变量。

6.7 函数重载

我们可以通过编写重载,指定函数的不同调用方式。具体方法为,为同一个函数写入多个同名但签名不同的函数头,函数实现紧随其后

function foo(): void;            /* 第一个函数定义 */
function foo(x: string): void;   /* 第二个函数定义 */
function foo(x?: string): void { /* 函数实现 */console.log(x)
}foo()     //  OK,使用第一个定义,输出:undefined
foo('aa') //  OK,使用第二个定义,输出:aa

不允许重载函数有相同的名字以及参数列表,否则将会编译报错。

7 总结

ArkTS声明的变量、常量、类型、函数都跟TypeScript的大致基本相同,与Java也极其相似。所以如果是有一定语言基础的小伙伴,学习ArkTS的语法毫无难度,基本按照官方文档提供的指引学习即可,后面章节我们会继续记录ArkTS的学习。

相关文章:

  • 软件工程之需求分析
  • 利用R语言heatmap.2函数进行聚类并画热图
  • LeetCode 每日一题 Day 9 ||简单dp
  • OpenVINS学习2——VIRAL数据集eee01.bag运行
  • 【C++11】lambda表达式及包装器
  • 通俗易懂,什么是.NET Core以及.NET Core能做什么
  • Rxjs 学习笔记 - 简化版
  • openssl的x509命令工具
  • Kubernetes入门笔记——(2)k8s设计文档
  • Axure安装及面板各区域详解
  • 【ArcGIS Pro微课1000例】0053:基于SQL Server创建与启用地理数据库
  • 数据结构:栈(Stack)的各种操作(入栈,出栈,判断栈非空,判断栈已满,附源码)
  • 第十六届山东省职业院校技能大赛高职组“应用软件系统开发”赛项样题
  • 【EI会议征稿】第三届电气、电力与电网系统国际会议(ICEPGS 2024)
  • DAP数据集成与算法模型如何结合使用
  • Codepen 每日精选(2018-3-25)
  • Java新版本的开发已正式进入轨道,版本号18.3
  • JDK 6和JDK 7中的substring()方法
  • js递归,无限分级树形折叠菜单
  • Laravel 中的一个后期静态绑定
  • MySQL用户中的%到底包不包括localhost?
  • php的插入排序,通过双层for循环
  • spring security oauth2 password授权模式
  • ViewService——一种保证客户端与服务端同步的方法
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 世界上最简单的无等待算法(getAndIncrement)
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 由插件封装引出的一丢丢思考
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 《码出高效》学习笔记与书中错误记录
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • #07【面试问题整理】嵌入式软件工程师
  • #1015 : KMP算法
  • (¥1011)-(一千零一拾一元整)输出
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (Java)【深基9.例1】选举学生会
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (JS基础)String 类型
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (NSDate) 时间 (time )比较
  • (二)PySpark3:SparkSQL编程
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (九)c52学习之旅-定时器
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (三)SvelteKit教程:layout 文件
  • (原)本想说脏话,奈何已放下
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • . Flume面试题
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET 发展历程