鸿蒙开发:ArkTs数据类型

简介: 最后一点是,ArkTS不支持any和unknown类型,需要显式指定具体类型,否则会报异常,具体原因是,这是ArkTS的特性之一,那就是使用静态类型;如果程序采用静态类型,即所有类型在编译时都是已知的,那么开发者就能够容易理解代码中使用了哪些数据结构。同时,由于所有类型在程序实际运行前都是已知的,编译器可以提前验证代码的正确性,从而可以减少运行时的类型检查,有助于提升性能。

前言


本文代码案例基于Api13。


数据类型,在开发中是最常见的,无论是哪一种语言,无时无刻不在与其打交道,它是编程语言中用于定义变量、函数返回值、数据结构等可以存储数据种类和范围的一种机制,它也是编程语言对内存中数据的抽象表示,正因为有了数据类型,才使得程序员能够以更加清晰和易于理解的方式编写代码,同时确保了数据的正确性和安全性。


无论是哪一种的编程语言,对于数据类型的表示可能有所区别,但也基本上可以分为两种类型,一种是基本数据类型,另一种是符合数据类型。


基本数据类型


在ArkTs中,用于表示基本数据类型的有两个,一个是number类型,另一个是布尔类型(Boolean)。


number类型:用于表示整数、浮点,它可以表示正数、负数或零,也可以表示单精度浮点和双精度浮点。

布尔类型(Boolean):用于表示逻辑上的真(True)和假(False)。布尔类型只有两个取值,通常用于条件判断和逻辑运算。


复合数据类型


复合数据类型,相对就比较多了,比如,字符串,数组,对象,枚举等等,具体如下:

字符串(String):字符的序列,用于表示文本数据。字符串中的字符可以是字母、数字、符号或空格等。


数组(Array):相同数据类型的元素的集合。数组中的元素可以通过索引(Index)来访问,索引通常是从0开始的整数。


类(Class):用于表示复杂的数据结构,可以包含多个不同类型的成员变量(属性)和成员函数(方法)。类在面向对象编程中非常重要。


联合(Union):允许在相同的内存位置存储不同类型的数据,但每次只能存储其中一种类型的数据。联合类型在嵌入式编程和系统级编程中较为常见。


枚举(Enum):为整数常量赋予友好的名字,使代码更加清晰和易于理解。枚举类型在定义一组有限的常量时非常有用。


函数类型:表示函数的签名,包括函数的返回类型和参数类型。函数类型在函数式编程和高级编程语言中较为常见。


需要注意的是,不同的编程语言可能支持不同的数据类型,并且相同的数据类型在不同编程语言中的实现和限制也可能有所不同,针对各个数据类型,我们一一进行概述。


数据类型汇总如下:


数据类型

概述

number

数值

boolean

布尔

string

字符串

void

没有任何返回值的类型

Object

对象

array

数组

enum

枚举

Union

联合类型

Aliases

匿名类型

undefined

一个未定义或不存在的值

null

never

永远不存在的类型


1、number类型


在ArkTs中,它没有像Java语言那么的严格,int是int,float是float,它涵盖的很大,任何整数和浮点数都可以被赋给此类型的变量,我们统称为数字字面量,而数字字面量又分为了整数字面量和十进制浮点数字面量。

整数字面量包括以下类别:

1、由数字序列组成的十进制整数。例如:6、88、-88


2、以0x(或0X)开头的十六进制整数,可以包含数字(0-9)和字母a-f或A-F。例如:0x22b8、0x00111、-0xF1A7


3、以0o(或0O)开头的八进制整数,只能包含数字(0-7)。例如:0o21270


4、以0b(或0B)开头的二进制整数,只能包含数字0和1。例如:0b10001010111000、0b0011、-0b11

浮点字面量包括以下:

1、十进制整数,可为有符号数(即,前缀为“+”或“-”);

2、小数点(“.”)

3、小数部分(由十进制数字字符串表示)

4、以“e”或“E”开头的指数部分,后跟有符号(即,前缀为“+”或“-”)或无符号整数。

代码示例:

let a = 8 //整数
let b = 8.88 //浮点数
let c = -888 //负数
let d = 0x22b8 // 十六进制
let e = 0o21270 // 八进制
let f = 0b10001010111000 //二进制
let g = 8e2

有一个问题需要注意,number类型在表示大整数时会造成精度丢失,在开发时可以按需使用bigInt类型来确保精度:

let bigInt: BigInt = BigInt('88888888888888888888888888888888888888888888888')
console.log("bigInt:" + bigInt.toString())


2、boolean类型

表示逻辑值 true 或 false,主要用于条件判断。


代码示例:


let isCompleted: boolean = false
if (isCompleted) {
  console.log ('Completed')
}


3、string类型


string类型的数据,是开发中最常见的,它代表字符序列,可以使用转义字符来表示字符,由于这一小节非常的重要,我们放到下章节中重点概述,当前,我们先基本的认识下string类型。

字符串字面量由单引号(')或双引号(")之间括起来的零个或多个字符组成。字符串字面量还有一特殊形式,是用反向单引号(`)括起来的模板字面量。

let s1 = 'Hello, world!\n';
let s2 = 'this is a string';
let a = 'Success';
let s3 = `The result is ${a}`;


4、void类型


void类型用于指定函数没有返回值。

此类型只有一个值,同样也是void,由于void是引用类型,因此它可以用于泛型类型参数。

class Class<T> {
  //...
}
let instance: Class <void>


5、Object类型


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

let a: Object = 8 //整数
let b: Object = true //布尔
let c: Object = "字符串" //字符串


但是,有一点需要注意,那就是小写的object和大写的Object是有区别的,那就是object类型主要用于表示除基本类型外的类型,如果把以上的代码,用object表示则会报异常。



6、array类型


array,即数组,也是非常重要的数据类型,再接下来的章节中,也会重点的讲述。

数组可由数组复合字面量(即用方括号括起来的零个或多个表达式的列表,其中每个表达式为数组中的一个元素)来赋值。数组的长度由数组中元素的个数来确定。数组中第一个元素的索引为0。

ArkTs中的数组比较特殊,如果你不确定相关类型,那么它的元素可以是多种类型的,如下代码,包含三个元素的数组。

let value = ['字符串', 88, true]


在实际的开发中,为了类型的精确,建议大家还是直接设置相关类型:

let value:string[] = ['字符串', '字符串2', '字符串3']

7、enum类型


enum类型,又称枚举类型,是预先定义的一组命名值的值类型,其中命名值又称为枚举常量。

使用枚举常量时必须以枚举类型名称为前缀。

enum ColorSet { 
  Red, Green, Blue 
}
let c: ColorSet = ColorSet.Red

常量表达式可以用于显式设置枚举常量的值。

enum ColorSet { 
  White = 0xFF, Grey = 0x7F, Black = 0x00 
}
let c: ColorSet = ColorSet.Black

8、Union类型


union类型,即联合类型,是由多个类型组合成的引用类型,联合类型包含了变量可能的所有类型,这个在系统的Api中非常的常见,比如文字的大小参数就是一个联合类型。

代码示例:


class Cat {
  name: string = 'cat';
  // ...
}
class Dog {
  name: string = 'dog';
  // ...
}
class Frog {
  name: string = 'frog';
  // ...
}
type Animal = Cat | Dog | Frog | number
// Cat、Dog、Frog是一些类型(类或接口)
let animal: Animal = new Cat()
animal = new Frog()
animal = 42;
// 可以将类型为联合类型的变量赋值为任何组成类型的有效值

可以用不同的机制获取联合类型中特定类型的值。

示例:

class Cat { 
  sleep () {
    
  }
  meow () {
    
  } 
}
class Dog { 
  sleep () {
  
}
  bark () {
  
} 
}
class Frog { 
  sleep () {
    
  }
  leap () {
    
  } 
}
type Animal = Cat | Dog | Frog;
function foo(animal: Animal) {
  if (animal instanceof Frog) {
    animal.leap()  // animal在这里是Frog类型
  }
  animal.sleep() // Animal具有sleep方法
}

9、Aliases类型


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

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


10、未定义或不存在的值undefined


当你定义了一个变量而为赋值时,那么它就是undefined,虽然说,可以直接设置undefined类型,但是一般情况下undefined并非单独使用,原因就在于后续的赋值问题。

let test:undefined


虽然说以上的代码不会出现问题,但是毫无意义,一般情况下,可以作为一个联合类型出现,如下代码:


let test: undefined | number
test = 0


当然更多的则是在成员变量的使用上,如下所示,带问号,就意味着这个属性可以为undefined。


test?:number


那么在以后的开发中,如果你不确定某个数据是否有值,无论对象还是其他类型,都可以进行undefined判断:


if (test != undefined) {
  console.log("有值")
} else {
  console.log("无值")
}


11、空null


null是一个表示"空值"的对象,通常用来表示变量的值为“没有值”,如果需要明确表示一个变量的值为空,就可以使用 null,和undefined的使用方式类似,一般不直接进行使用,可以结合其它类型进行联合使用。


let test: null | number
test = 0


除了变量的默认值赋值为null之外, 还可以用来作为函数的返回值,当函数没有需要返回的值时,可以使用 return null,表示函数的返回值为空。


null和undefined进行比较


1、null 表示对象为空,而 undefined 表示缺少值。

2、声明变量但未赋值时,变量的值为 undefined,当需要表示空值时,可以使用 null。

3、在比较时,null 和 undefined 的值相等,但数据类型不同。


12、永远不存在的类型never


never类型在开发中很少会遇到,它是任何类型的子类型,可以赋值给任何类型,但是,有一点需要知道,never是没有子类型的。

never类型一般是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型,如下举例所示:


// 抛出异常
  error(message: string): never {
    throw new Error(message);
  }
  //无返回值
  infiniteLoop(): never {
    while (true) {
    }
  }


小结


无论是哪一种类型,如果是成员变量,在没有默认值的情况下,需要加类型和问号,如下代码所示:


test?: number


还有一点是比较好的,那就是,ArkTs和也具有类型推断功能,类型可以不写也不会报错,为了避免冗余,日后的书写也建议舍弃类型,前提是有默认值的情况下。


let test = 0


有些场景下,特别是联合类型的时候,我们需要判断当前的属性是哪一个类型,我们可以通过typeof关键字来判断,举例如下:


let a = 1
let type = typeof a


最后一点是,ArkTS不支持any和unknown类型,需要显式指定具体类型,否则会报异常,具体原因是,这是ArkTS的特性之一,那就是使用静态类型;如果程序采用静态类型,即所有类型在编译时都是已知的,那么开发者就能够容易理解代码中使用了哪些数据结构。同时,由于所有类型在程序实际运行前都是已知的,编译器可以提前验证代码的正确性,从而可以减少运行时的类型检查,有助于提升性能。

相关文章
|
28天前
|
人工智能 物联网 Android开发
【04】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-自定义一个设置输入小部件组件-完成所有设置setting相关的页面-优雅草卓伊凡
【04】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-自定义一个设置输入小部件组件-完成所有设置setting相关的页面-优雅草卓伊凡
160 92
|
29天前
|
前端开发 API 开发者
harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)
本文由黑臂麒麟(6年前端经验)撰写,介绍ArkTS开发中的常用基础组件与布局组件。基础组件包括Text、Image、Button等,支持样式设置如字体颜色、大小和加粗等,并可通过Resource资源引用统一管理样式。布局组件涵盖Column、Row、List、Grid和Tabs等,支持灵活的主轴与交叉轴对齐方式、分割线设置及滚动事件监听。同时,Tabs组件可实现自定义样式与页签切换功能。内容结合代码示例,适合初学者快速上手ArkTS开发。参考华为开发者联盟官网基础课程。
157 75
harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)
|
1天前
|
安全 索引
鸿蒙开发:如何更新对象数组
关于对象数组中的数据更新,目前例举了三种方式,一种是传统的装饰器方式,另外两种是针对数据源进行操作,数据源直接赋值的方式,适合简单、高频的单元素修改,性能最优且类型安全,而splice方法适合复杂操作或需保持引用稳定的场景,但需注意性能损耗,在实际的开发中可以根据需求,选择自己适合的方式。
59 34
|
28天前
|
人工智能 物联网 Android开发
【03】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-在lib目录新建自定义库UtilsLibrary,ComponentLibrary,CommonConstLibrary完成设置SettingsView.ets初始公共类书写-优雅草卓伊凡
【03】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-在lib目录新建自定义库UtilsLibrary,ComponentLibrary,CommonConstLibrary完成设置SettingsView.ets初始公共类书写-优雅草卓伊凡
71 23
【03】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-在lib目录新建自定义库UtilsLibrary,ComponentLibrary,CommonConstLibrary完成设置SettingsView.ets初始公共类书写-优雅草卓伊凡
|
28天前
|
存储 人工智能 物联网
【02】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-登录页面LoginView.ets完成-并且详细解释关于arkui关于 CommonConst, commonColor, InputDataModel-优雅草卓伊凡
【02】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-登录页面LoginView.ets完成-并且详细解释关于arkui关于 CommonConst, commonColor, InputDataModel-优雅草卓伊凡
60 14
【02】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-登录页面LoginView.ets完成-并且详细解释关于arkui关于 CommonConst, commonColor, InputDataModel-优雅草卓伊凡
|
28天前
|
人工智能 物联网 编译器
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
48 11
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
|
25天前
|
人工智能 JavaScript 数据安全/隐私保护
鸿蒙开发难题多到崩溃?然而 10 亿终端暗藏财富密码-卓伊凡
鸿蒙开发难题多到崩溃?然而 10 亿终端暗藏财富密码-卓伊凡
50 5
鸿蒙开发难题多到崩溃?然而 10 亿终端暗藏财富密码-卓伊凡
|
13天前
|
人工智能 前端开发 物联网
【05】20250416优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-增加告警中心相关卡片页面WarningCardWidget相关-增加Canvas 绘制折线图-Canvas 绘制柱状图-首页-优雅草卓伊凡
【05】20250416优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-增加告警中心相关卡片页面WarningCardWidget相关-增加Canvas 绘制折线图-Canvas 绘制柱状图-首页-优雅草卓伊凡
34 0
【05】20250416优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-增加告警中心相关卡片页面WarningCardWidget相关-增加Canvas 绘制折线图-Canvas 绘制柱状图-首页-优雅草卓伊凡
|
18天前
|
缓存 开发工具 开发者
鸿蒙NEXT开发App相关工具类(ArkTs)
这段代码展示了一个名为鸿蒙NEXT开发 `AppUtil` 的工具类,主要用于管理鸿蒙应用的上下文、窗口、状态栏、导航栏等配置。它提供了多种功能,例如设置灰阶模式、颜色模式、字体类型、屏幕亮度、窗口属性等,并支持获取应用包信息(如版本号、包名等)。该工具类需在 UIAbility 的 `onWindowStageCreate` 方法中初始化,以便缓存全局变量。代码由鸿蒙布道师编写,适用于鸿蒙系统应用开发,帮助开发者更便捷地管理和配置应用界面及系统属性。
|
6天前
|
安全 前端开发 Android开发
拥抱国产化:转转APP的鸿蒙NEXT端开发尝鲜之旅
本文将要分享的是转转APP在开发全新鸿蒙NEXT端所遇到的一些问题,对比了鸿蒙开发和 Android、iOS 的不同,总结了这次开发过程中的一些经验等等。希望能带给你启发。
21 0