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

ArkTS语言(五)

学习ArkTS语言

ArkTS是HarmonyOS的主要应用开发语言,在TypeScript基础上进行了扩展,保留了其基本风格,并通过增强静态检查和分析来提高程序的稳定性和性能。本教程将帮助开发者掌握ArkTS的核心功能、语法及最佳实践,以便高效地构建高性能移动应用。

1. RegExp 正则表达式

1.1 概述

正则表达式是处理文本匹配和替换的强大工具。TypeScript 中的 RegExp 对象提供了丰富的方法来执行模式匹配、替换和文本分割等操作。掌握这些方法可以帮助你高效处理各种字符串操作任务。

eg:判断用户输入的手机号码是否符合规则?

  1. 必须是11位字符组成,而且必须是纯数字
  2. 第一位字符必须是1
  3. 第二位字符可以是3,4,5,6,7,8,9
  4. 其他每一位都可以是0到9的任一字符

以上需求如果用传统的if\else做判断,就特别麻烦,但是用正则表达式一句话就搞定了。废话不多说,先体验一下

let phoneNumber = '13797168808'
const regex = /[1][3-9][0-9]{9}/
const result = regex.test(phoneNumber) 
console.log("匹配结果:", result)	//true

1.2 创建

  • 使用正则表达式字面量,它由斜杠之间的模式组成。
const re = /ab+c/;

正则表达式文本在加载脚本时提供正则表达式的编译。 如果正则表达式保持不变,则使用 this 可以提高性能。

  • 或者调用 RegExp 对象的构造函数。
const re = new RegExp("ab+c");

使用 constructor 函数提供正则表达式的运行时编译。 当您知道正则表达式模式将发生变化,或者您不知道该模式并从其他来源(如用户输入)获取它时,请使用 constructor 函数。

1.3 规则

字符类
● [abc]:匹配方括号内的任意一个字符。
● [^abc]:匹配不在方括号内的任意一个字符。
● [a-z]:匹配从a到z的所有小写字母。
● \d:匹配任何数字(等价于 [0-9])。
● \D:匹配任何非数字(等价于 [^0-9])。
● \w:匹配任何字母、数字或下划线(等价于 [a-zA-Z0-9_])。
● \W:匹配任何非字母、数字或下划线(等价于 [^a-zA-Z0-9_])。
● \s:匹配任何空白字符(包括空格、制表符、换行符等)。
● \S:匹配任何非空白字符。
量词
● *:匹配前面的子表达式零次或多次。
● +:匹配前面的子表达式一次或多次。
● ?:匹配前面的子表达式零次或一次。
● {n}:匹配前面的子表达式恰好n次。
● {n,}:匹配前面的子表达式至少n次。
● {n,m}:匹配前面的子表达式至少n次,最多m次。
● *?, +?, ??, {n,}?, {n,m}?:非贪婪匹配(尽可能少地匹配)。
锚点
● ^:匹配字符串的开始位置。
● $:匹配字符串的结束位置。
● \b:匹配单词边界。
● \B:匹配非单词边界。
选择符
● |:逻辑或操作。例如,cat|dog 匹配 "cat" 或 "dog"。
转义字符
● \:用于转义特殊字符。例如,. 匹配一个点字符。
标志(Flags)
● g:全局匹配,找到所有匹配项。
● i:忽略大小写。

1.4 函数

1.4.1 RegExp.test(string: string): boolean

  • test():boolean 是RegExp的方法,需要使用正则表达式对象调用,测试字符串是否匹配正则表达式的规则。匹配返回true,不匹配返回false
const regex = /hello/;
console.log(regex.test("hello world")); // true

1.4.2 String.prototype.search(regexp: string | RegExp): number;

● 功能:执行正则表达式搜索,返回匹配的第一个位置的索引,如果没有找到则返回 -1。
● 参数:
○ regexp(必需):要使用的正则表达式对象。
● 返回值:匹配的第一个位置的索引,如果没有找到则返回 -1。
● 示例:

const str = "Hello, world!";
console.log('查找world的索引:',str.search(/world/)); // 输出: 7
console.log('查找Java的索引:',str.search(/Java/)); // 输出: -1

1.4.3 String.prototype.match(regexp: string | RegExp): RegExpMatchArray | null;

● 功能:执行正则表达式匹配,返回匹配结果或 null。
● 参数:
○ regexp(必需):要使用的正则表达式对象。
● 返回值:如果匹配成功,返回一个包含匹配结果的数组;否则返回 null。
● 示例:


const str = "Hello, world! Hello, Harmony! 027-43422424 01043422424";
let match1 = str.match(/Hello/g)  //匹配str中所有匹配正则表达式的结果,并返回数组
console.log("匹配结果:",match1) //Hello,Hellolet match2 = str.match(/Hello/)  //查找str中第一个匹配正则表达式的结果,并返回数组
console.log("匹配结果:",match2) //Hellolet match3 = str.match(/Java/)  //查找str中第一个匹配正则表达式的结果,并返回数组
console.log("匹配结果:",match3) //nulllet match4 = str.match(/\d{3,4}-?\d{7,9}/)  //查找str中第一个匹配正则表达式的结果,并返回数组
console.log("匹配结果:",match4?.[0]) //027-43422424let match5 = str.match(/\d{3,4}-?\d{7,9}/g)  //查找str中所有匹配正则表达式的结果,并返回数组
console.log("匹配结果:",match5) //027-43422424,01043422424let match6 = str.match(/(\d{3,4})-?(\d{7,9})/)  //非全局模式下,进行分组匹配,从左到右每一个()表示一组,分别获取每一组子串,并存入数组中返回
if (match6){console.log("匹配结果:",match6?.[0]) //027-43422424console.log("匹配结果:",match6?.[1]) //027console.log("匹配结果:",match6?.[2]) //43422424
}

1.4.4 String.prototype.replace(regex:RegExp,replaceValue:string)

const str1 = "大家好,我叫叫叫叫王王王王大大大大大可可可可可";
const replaced = str1.replace(/[叫]+/,'叫').replace(/[王]+/,'王').replace(/[大]{2,}/,'大').replace(/[可]+/, '可')
console.log(replaced); // 大家好,我叫王大可const str2 = "大家好,我叫叫叫叫楚楚楚楚中中中中中中天天天天";
const replaced2 = str2.replace(/([\u4e00-\u9fff])\1+/g,'$1')
console.log(replaced2); // 大家好,我叫王大可

1.5 分组

  • 捕获组:(...) 用于捕获匹配的子串。
const regex = /(\d{4})-(\d{2})-(\d{2})/;
const match = regex.exec("2023-10-15");
console.log(match[1], match[2], match[3]); // 2023 10 15

1.6 引用

  • 反向引用:\1, \2, ... 用于引用前面捕获的组。
const str = "The quick brown fox jumps over the lazy dog";
const replaced = str.replace(/(\b\w+)\s+\1\b/g, '$1');
console.log(replaced); // "The quick brown fox jumps over the lazy dog" (假设没有重复的单词)

2. 泛型

泛型(Generics)是一种编程语言特性,允许在定义函数、类、接口等时使用占位符来表示类型,而不是具体的类型。泛型占位符通常使用、<K,V>表示,实际上你可以使用任何字母。它可以用在类上、方法上、接口上。用在类上叫泛型类,用在方法上叫泛型方法,用在接口上叫泛型接口。

2.1 泛型类

在类名的后面表示在此类中,你可以把T当做一个已知的数据类型来使用,等到创建该类对象时,明确的具体类型。

//Box内部封装一个T类型的数据,但是不知道T具体是什么类型。
class Box<T> {private value: T;constructor(value: T) {this.value = value;}getValue(): T {return this.value;}
}// 创建Box对象,并指定<T>为<string>类型
let box1 = new Box<string>("TypeScript");
console.log(box1.getValue()); // 输出: TypeScript// 创建Box对象,并指定<T>为<number>类型
let box2 = new Box<number>(30);
console.log(box2.getValue()); // 输出: 30

2.2 泛型接口

可以使用泛型来定义接口,使接口的成员能够使用任意类型:

// 基本语法
interface Entry<T, U> {key: T;value: U;
}// 使用泛型接口
let entry: Entry<string, number> = { key: "zhangsan", value: 42 };
console.log(entry.key);     //zhangsan
console.log(entry.value);   //42let entry: Entry<string, string> = { key: "zhangsan", value: "42" };
console.log(entry.key);     //zhangsan
console.log(entry.value);   //42

2.3 泛型方法

使用泛型来创建一个可以处理不同类型的函数:

// 定义泛型函数
function get<T>(args: T): string {return "hello "+args;
}// 使用泛型函数
let result = get<string>("ZhangSan");
console.log(result); // 输出: hello ZhangSanlet numberResult = get<number>(42);
console.log(numberResult); // 输出: hello 42

3.空安全

3.1 null的含义

null 是一个特殊的字面量值,用于表示一个变量没有指向任何对象。当变量值为null时,使用这个变量是没有意义,甚至会引发程序异常,所以默认情况下ArkTS中的所有类型的值都是不可为null值;要想变量的值为null,必须明确指定null类型。

let x: string = null    // 编译时错误
let y: string | null = null	//编译通过

3.2 ?非空校验

在开发中经常存在这么一种情况:一个变量的值可能为null、也可能是一个具体对象,但是在执行之前不能明确该变量的值是null还是一个对象。 此时使用该对象调用其方法时,就必须使用非空判断

let flag = true
let stu: student | null = null
if (flag) {stu = new student('张三', 20)
}
if (stu != null) {stu.show()
}
console.info("over")

为了简化非空判断的书写,可以使用“可选链”的语法,对象变量?.方法名()

let flag = true
let stu: stud
ent | null = null
if (flag) {stu = new student('张三', 20)
}
stu?.show() //语义:stu不为null,才调用show方法,否则啥也不敢
console.info("over")

3.3 ! 强制非空断言

如果你自己主动明确该变量不为空,想要强制使用该变量,则可以使用变量名!强制断言变量非空,跳过编译检查。

let flag = true
let stu: student | null = null
if (flag) {stu = new student('张三', 20)
}
stu!.show() //语义:不管stu是否为null,强制调用show()
console.info("over")

3.4 ??空值合并运算符

如下代码表示,a不为null或者undefined时,res1等于a值,否则res1="hello"

let a: string | undefined | null = undefined
let res1 = (a != null && a != undefined) ? a : "hello"

在以上的场景下,可以将三元运算采用??进行简化书写,其语义是一样的。

let b: string | undefined | null = undefined
let res2 = a??"hello"	//a不为null或者undefined时,res2等于a值,否则res2="hello"

鸿蒙学习地址

http://www.hskmm.com/?act=detail&tid=40580

相关文章:

  • 2025 年铝塑板厂家最新推荐榜,从技术研发到市场服务多维度考量,企业综合实力与产品竞争力深度剖析网纹/磨砂/大理石/木纹/幻彩铝塑板公司推荐
  • HarmonyOS6纯血鸿蒙开发
  • K8S如何查询PVC的已用容量和剩余可用容量
  • 学术会议会议合集 | 人工智能、未来教育 、智能控制 、计算科学 、传感器技术等EI会议合集
  • 2025 年水磨石厂家最新推荐榜,技术实力与市场口碑深度解析水磨石预制板/人造水磨石/水磨石地砖/水磨石成品地砖/彩色水磨石地砖公司推荐
  • 2025年10月短视频营销公司实力榜:五强对比评测与选择指南
  • kettle调度系统-kettle嵌入集成方式调度,稳如磐石,一分钟完成任务调度配置
  • 探索 RoCE v2:高性能网络技术在 AI 场景中的应用
  • K8S下的GPU监控
  • Unreal:多屏幕全屏后只有一个屏幕显示怎么办
  • MyEMS 的智慧大脑:从能耗建模到预测性维护的全流程技术逻辑
  • Linux-按下开机键后,究竟发生了什么
  • 用Go语言从零开始开发一个Prometheus Exporter
  • AI基础概念扫盲:人工智能入门指南
  • K8s v1.2到v1.34:从容器编排到 AI/ML 的云原生未来
  • 根据名称排序(中文、英文、数字)等
  • 2025年贵州推拿正骨培训机构权威推荐榜单:小儿按摩培训/小儿推拿培训/穴位敷贴培训源头机构精选
  • Docker存储驱动OverLay2介绍
  • 2025年哈尔滨ISO环境体系认证渠道权威推荐榜单:辽宁ISO20000质量管理体系认证/沈阳ISO20000质量管理体系/大连ISO三体系认证源头公司精选
  • 2025.10.29——1绿1蓝
  • 2025年北京配电室试验方案公司权威推荐:天津配电室打压试验/河北配电室静电地板试验/石家庄配电室高压保护试验服务机构精选
  • ASP.NET Core Web API 需要先发布到 IIS 服务器才能运行
  • TPT-X-2025.09 焕新上线!汽车电子测试效率再升级,解决测试痛点!
  • Windows11由22H2升级至25H2后,VSCode出现“扩展主机意外终止”问题及解决
  • 2025年数控对头钻批发厂家权威推荐:数控龙门镗铣床/数控双面镗/数控双面镗铣床源头厂家精选
  • 设置E8流程中相关资源无法查看,防止附件被查看
  • GO_gorm
  • Air8000模块CAN接口硬件连接指南,来啦!
  • 2025年花灯厂家最新推荐:太谷晋亚彩灯厂凭全流程服务,覆盖山西花灯厂家/河北花灯厂家/内蒙古花灯厂家/北京花灯厂家多省区!
  • 【IEEE出版 | 快至会后3个月完成检索 | 会议历史优秀】第五届人工智能、机器人和通信国际会议(ICAIRC 2025)