鴻蒙開發(fā):ArkTs數(shù)據(jù)類型

前言

本文代碼案例基于Api13。

數(shù)據(jù)類型,在開發(fā)中是最常見的,無論是哪一種語言,無時無刻不在與其打交道,它是編程語言中用于定義變量、函數(shù)返回值、數(shù)據(jù)結構等可以存儲數(shù)據(jù)種類和范圍的一種機制,它也是編程語言對內存中數(shù)據(jù)的抽象表示,正因為有了數(shù)據(jù)類型,才使得程序員能夠以更加清晰和易于理解的方式編寫代碼,同時確保了數(shù)據(jù)的正確性和安全性。

無論是哪一種的編程語言,對于數(shù)據(jù)類型的表示可能有所區(qū)別,但也基本上可以分為兩種類型,一種是基本數(shù)據(jù)類型,另一種是符合數(shù)據(jù)類型。

基本數(shù)據(jù)類型

在ArkTs中,用于表示基本數(shù)據(jù)類型的有兩個,一個是number類型,另一個是布爾類型(Boolean)。

number類型:用于表示整數(shù)、浮點,它可以表示正數(shù)、負數(shù)或零,也可以表示單精度浮點和雙精度浮點。

布爾類型(Boolean):用于表示邏輯上的真(True)和假(False)。布爾類型只有兩個取值,通常用于條件判斷和邏輯運算。

復合數(shù)據(jù)類型

復合數(shù)據(jù)類型,相對就比較多了,比如,字符串,數(shù)組,對象,枚舉等等,具體如下:

字符串(String):字符的序列,用于表示文本數(shù)據(jù)。字符串中的字符可以是字母、數(shù)字、符號或空格等。

數(shù)組(Array):相同數(shù)據(jù)類型的元素的集合。數(shù)組中的元素可以通過索引(Index)來訪問,索引通常是從0開始的整數(shù)。

類(Class):用于表示復雜的數(shù)據(jù)結構,可以包含多個不同類型的成員變量(屬性)和成員函數(shù)(方法)。類在面向對象編程中非常重要。

聯(lián)合(Union):允許在相同的內存位置存儲不同類型的數(shù)據(jù),但每次只能存儲其中一種類型的數(shù)據(jù)。聯(lián)合類型在嵌入式編程和系統(tǒng)級編程中較為常見。

枚舉(Enum):為整數(shù)常量賦予友好的名字,使代碼更加清晰和易于理解。枚舉類型在定義一組有限的常量時非常有用。

函數(shù)類型:表示函數(shù)的簽名,包括函數(shù)的返回類型和參數(shù)類型。函數(shù)類型在函數(shù)式編程和高級編程語言中較為常見。

需要注意的是,不同的編程語言可能支持不同的數(shù)據(jù)類型,并且相同的數(shù)據(jù)類型在不同編程語言中的實現(xiàn)和限制也可能有所不同,針對各個數(shù)據(jù)類型,我們一一進行概述。

數(shù)據(jù)類型匯總如下:

數(shù)據(jù)類型 概述
number 數(shù)值
boolean 布爾
string 字符串
void 沒有任何返回值的類型
Object 對象
array 數(shù)組
enum 枚舉
Union 聯(lián)合類型
Aliases 匿名類型
undefined 一個未定義或不存在的值
null
never 永遠不存在的類型

1、number類型

在ArkTs中,它沒有像Java語言那么的嚴格,int是int,float是float,它涵蓋的很大,任何整數(shù)和浮點數(shù)都可以被賦給此類型的變量,我們統(tǒng)稱為數(shù)字字面量,而數(shù)字字面量又分為了整數(shù)字面量和十進制浮點數(shù)字面量。

整數(shù)字面量包括以下類別:

1、由數(shù)字序列組成的十進制整數(shù)。例如:6、88、-88

2、以0x(或0X)開頭的十六進制整數(shù),可以包含數(shù)字(0-9)和字母a-f或A-F。例如:0x22b8、0x00111、-0xF1A7

3、以0o(或0O)開頭的八進制整數(shù),只能包含數(shù)字(0-7)。例如:0o21270

4、以0b(或0B)開頭的二進制整數(shù),只能包含數(shù)字0和1。例如:0b10001010111000、0b0011、-0b11

浮點字面量包括以下:

1、十進制整數(shù),可為有符號數(shù)(即,前綴為“+”或“-”);

2、小數(shù)點(“.”)

3、小數(shù)部分(由十進制數(shù)字字符串表示)

4、以“e”或“E”開頭的指數(shù)部分,后跟有符號(即,前綴為“+”或“-”)或無符號整數(shù)。

代碼示例:

let a = 8 //整數(shù)
let b = 8.88 //浮點數(shù)
let c = -888 //負數(shù)
let d = 0x22b8 // 十六進制
let e = 0o21270 // 八進制
let f = 0b10001010111000 //二進制
let g = 8e2

有一個問題需要注意,number類型在表示大整數(shù)時會造成精度丟失,在開發(fā)時可以按需使用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類型的數(shù)據(jù),是開發(fā)中最常見的,它代表字符序列,可以使用轉義字符來表示字符,由于這一小節(jié)非常的重要,我們放到下章節(jié)中重點概述,當前,我們先基本的認識下string類型。

字符串字面量由單引號(')或雙引號(")之間括起來的零個或多個字符組成。字符串字面量還有一特殊形式,是用反向單引號(`)括起來的模板字面量。

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

4、void類型

void類型用于指定函數(shù)沒有返回值。

此類型只有一個值,同樣也是void,由于void是引用類型,因此它可以用于泛型類型參數(shù)。

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

5、Object類型

Object類型是所有引用類型的基類型,任何值,包括基本類型的值(它們會被自動裝箱),都可以直接被賦給Object類型的變量。

let a: Object = 8 //整數(shù)
let b: Object = true //布爾
let c: Object = "字符串" //字符串

但是,有一點需要注意,那就是小寫的object和大寫的Object是有區(qū)別的,那就是object類型主要用于表示除基本類型外的類型,如果把以上的代碼,用object表示則會報異常。

6、array類型

array,即數(shù)組,也是非常重要的數(shù)據(jù)類型,再接下來的章節(jié)中,也會重點的講述。

數(shù)組可由數(shù)組復合字面量(即用方括號括起來的零個或多個表達式的列表,其中每個表達式為數(shù)組中的一個元素)來賦值。數(shù)組的長度由數(shù)組中元素的個數(shù)來確定。數(shù)組中第一個元素的索引為0。

ArkTs中的數(shù)組比較特殊,如果你不確定相關類型,那么它的元素可以是多種類型的,如下代碼,包含三個元素的數(shù)組。

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

在實際的開發(fā)中,為了類型的精確,建議大家還是直接設置相關類型:

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類型,即聯(lián)合類型,是由多個類型組合成的引用類型,聯(lián)合類型包含了變量可能的所有類型,這個在系統(tǒng)的Api中非常的常見,比如文字的大小參數(shù)就是一個聯(lián)合類型。


代碼示例:

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;
// 可以將類型為聯(lián)合類型的變量賦值為任何組成類型的有效值

可以用不同的機制獲取聯(lián)合類型中特定類型的值。

示例:

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類型為匿名類型(數(shù)組、函數(shù)、對象字面量或聯(lián)合類型)提供名稱,或為已有類型提供替代名稱。

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并非單獨使用,原因就在于后續(xù)的賦值問題。

 let test:undefined

雖然說以上的代碼不會出現(xiàn)問題,但是毫無意義,一般情況下,可以作為一個聯(lián)合類型出現(xiàn),如下代碼:

let test: undefined | number
test = 0

當然更多的則是在成員變量的使用上,如下所示,帶問號,就意味著這個屬性可以為undefined。

test?:number

那么在以后的開發(fā)中,如果你不確定某個數(shù)據(jù)是否有值,無論對象還是其他類型,都可以進行undefined判斷:

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

11、空null

null是一個表示"空值"的對象,通常用來表示變量的值為“沒有值”,如果需要明確表示一個變量的值為空,就可以使用 null,和undefined的使用方式類似,一般不直接進行使用,可以結合其它類型進行聯(lián)合使用。


let test: null | number
test = 0

除了變量的默認值賦值為null之外, 還可以用來作為函數(shù)的返回值,當函數(shù)沒有需要返回的值時,可以使用 return null,表示函數(shù)的返回值為空。

null和undefined進行比較

1、null 表示對象為空,而 undefined 表示缺少值。

2、聲明變量但未賦值時,變量的值為 undefined,當需要表示空值時,可以使用 null。

3、在比較時,null 和 undefined 的值相等,但數(shù)據(jù)類型不同。

12、永遠不存在的類型never

never類型在開發(fā)中很少會遇到,它是任何類型的子類型,可以賦值給任何類型,但是,有一點需要知道,never是沒有子類型的。

never類型一般是那些總是會拋出異?;蚋揪筒粫蟹祷刂档暮瘮?shù)表達式或箭頭函數(shù)表達式的返回值類型,如下舉例所示:

// 拋出異常
  error(message: string): never {
    throw new Error(message);
  }

  //無返回值
  infiniteLoop(): never {
    while (true) {
    }
  }

小結

無論是哪一種類型,如果是成員變量,在沒有默認值的情況下,需要加類型和問號,如下代碼所示:

  test?: number

還有一點是比較好的,那就是,ArkTs和也具有類型推斷功能,類型可以不寫也不會報錯,為了避免冗余,日后的書寫也建議舍棄類型,前提是有默認值的情況下。

let test = 0

有些場景下,特別是聯(lián)合類型的時候,我們需要判斷當前的屬性是哪一個類型,我們可以通過typeof關鍵字來判斷,舉例如下:

let a = 1
let type = typeof a

最后一點是,ArkTS不支持any和unknown類型,需要顯式指定具體類型,否則會報異常,具體原因是,這是ArkTS的特性之一,那就是使用靜態(tài)類型;如果程序采用靜態(tài)類型,即所有類型在編譯時都是已知的,那么開發(fā)者就能夠容易理解代碼中使用了哪些數(shù)據(jù)結構。同時,由于所有類型在程序實際運行前都是已知的,編譯器可以提前驗證代碼的正確性,從而可以減少運行時的類型檢查,有助于提升性能。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容