一、簡(jiǎn)介
ArkTS是一種設(shè)計(jì)用于構(gòu)建高性能應(yīng)用的編程語(yǔ)言。它在繼承TypeScript語(yǔ)法的基礎(chǔ)上進(jìn)行了優(yōu)化,以提供更高的性能和開發(fā)效率。
環(huán)境配置如下所示:
API:18
SDK:OpenHarmony-v5.1.0-Release
代碼倉(cāng):https://gitee.com/Lockzhiner-Electronics/lingyu-rk3566-openharmony/tree/master/samples/C02_DataTypeAndVariableDeclaration
二、基礎(chǔ)知識(shí)
ArkTS通過聲明引入變量、常量、類型和函數(shù)。
2.1 變量聲明
使用關(guān)鍵字let聲明的變量可以在程序執(zhí)行期間具有不同的值。使用TS風(fēng)格,聲明的時(shí)候使用冒號(hào)給出數(shù)據(jù)類型。
lethi:string='hello';
letnum:number=0;
2.2 常量聲明
使用關(guān)鍵字const聲明的常量為只讀類型,只能被賦值一次。
consthello:string='hello';
對(duì)常量重新賦值會(huì)造成編譯時(shí)錯(cuò)誤。
2.3 自動(dòng)類型推斷
如果變量或常量的聲明包含初始值,開發(fā)者無(wú)需顯式指定類型,因?yàn)锳rkTS規(guī)范已列舉了所有允許自動(dòng)推斷類型的場(chǎng)景。
以下示例中,兩條聲明語(yǔ)句都是有效的,兩個(gè)變量都是string類型:
lethi1:string='hello';
lethi2='hello, world';
2.4 數(shù)據(jù)類型
基本數(shù)據(jù)類型包括number、string等簡(jiǎn)單類型,它們可以準(zhǔn)確地表示單一的數(shù)據(jù)類型。對(duì)基本類型的存儲(chǔ)和訪問都是直接的,比較時(shí)直接比較其值。
引用類型包括對(duì)象、數(shù)組和函數(shù)等復(fù)雜數(shù)據(jù)結(jié)構(gòu)。這些類型通過引用訪問數(shù)據(jù),對(duì)象和數(shù)組可以包含多個(gè)值或鍵值對(duì),函數(shù)則可以封裝可執(zhí)行的代碼邏輯。引用類型在內(nèi)存中通過指針訪問數(shù)據(jù),修改引用會(huì)影響原始數(shù)據(jù)。
2.4.1 number類型
ArkTS提供number類型,任何整數(shù)和浮點(diǎn)數(shù)都可以被賦給此類型的變量。
數(shù)字字面量包括整數(shù)字面量和十進(jìn)制浮點(diǎn)數(shù)字面量。
整數(shù)字面量包括以下類別:
十進(jìn)制整數(shù),由數(shù)字序列組成。例如:0、117、-345。
十六進(jìn)制整數(shù),以0x(或0X)開頭,包含數(shù)字(0-9)和字母a-f或A-F。例如:0x1123、0x00111、-0xF1A7。
八進(jìn)制整數(shù),以0o(或0O)開頭,只能包含數(shù)字(0-7)。例如:0o777。
二進(jìn)制整數(shù),以0b(或0B)開頭,只能包含數(shù)字0和1。例如:0b11、0b0011、-0b11。
浮點(diǎn)數(shù)字面量包括以下部分:
十進(jìn)制整數(shù),可為有符號(hào)數(shù)(前綴為"+"或"-")。
小數(shù)點(diǎn)(".")。
小數(shù)部分(由十進(jìn)制數(shù)字字符串表示)。
指數(shù)部分,以"e"或"E"開頭,后跟有符號(hào)(前綴為"+"或"-")或無(wú)符號(hào)整數(shù)。
示例:
letn1 =3.14;letn2 =3.141592;letn3 =.5;letn4 =1e2;functionfactorial(n:number):number{ if(n <=?1) {? ? return?1;? }? return?n *?factorial(n -?1);}factorial(n1) ?// ?7.660344000000002?factorial(n2) ?// ?7.680640444893748?factorial(n3) ?// ?1?factorial(n4) ?// ?9.33262154439441e+157?
number類型在表示大整數(shù)(即超過-9007199254740991~9007199254740991)時(shí)會(huì)造成精度丟失。在開發(fā)時(shí)可以按需使用bigint類型來(lái)確保精度:
letbigInt:BigInt=BigInt('999999999999999999999999999999999999999999999999999999999999');console.info('bigInt:'+ bigInt.toString());
2.4.2 boolean類型
boolean類型由true和false兩個(gè)邏輯值組成。
通常在條件語(yǔ)句中使用boolean類型的變量:
letisDone:boolean=false;// ...if(isDone) { console.info('Done!');}
2.4.3 string類型
string類型代表字符序列,可以使用轉(zhuǎn)義字符來(lái)表示字符。
字符串字面量由單引號(hào)(')或雙引號(hào)(")之間括起來(lái)的零個(gè)或多個(gè)字符組成。字符串字面量還有一特殊形式,是用反向單引號(hào)(``)括起來(lái)的模板字面量。
lets1 ='Hello, world!\n';lets2 ="this is a string";leta ='Success';lets3 =`The result is${a}`;
2.4.4 void類型
void類型用于指定函數(shù)沒有返回值。
此類型只有一個(gè)值,同樣是void。由于void是引用類型,因此它可以用于泛型類型參數(shù)。
classClass
2.4.5 Object類型
Object類型是所有引用類型的基類型。任何值,包括基本類型的值,都可以直接被賦給Object類型的變量(基本類型值會(huì)被自動(dòng)裝箱)。Object類型用于表示除基本類型外的類型。
leto1:Object='Alice';leto2:Object= ['a','b'];leto3:Object=1;
2.4.6 array類型
array類型,即數(shù)組,是由可賦值給數(shù)組聲明中指定的元素類型的數(shù)據(jù)組成的對(duì)象。
數(shù)組可由數(shù)組復(fù)合字面量賦值。數(shù)組復(fù)合字面量是用方括號(hào)括起來(lái)的零個(gè)或多個(gè)表達(dá)式列表,每個(gè)表達(dá)式為數(shù)組中的一個(gè)元素。數(shù)組的長(zhǎng)度由數(shù)組中元素的個(gè)數(shù)確定。數(shù)組中第一個(gè)元素的索引為0。
以下示例將創(chuàng)建包含三個(gè)元素的數(shù)組:
letnames:string[]=['Alice','Bob','Carol'];
2.4.7 enum類型
enum類型,即枚舉類型,是預(yù)先定義的一組命名值的值類型,其中命名值又稱為枚舉常量。
使用枚舉常量時(shí)必須以枚舉類型名稱為前綴。
enumColorSet { Red, Green, Blue }letc: ColorSet = ColorSet.Red;
常量表達(dá)式用于顯式設(shè)置枚舉常量的值。
enumColorSet { White =0xFF, Grey =0x7F, Black =0x00 }letc: ColorSet = ColorSet.Black;
2.4.8 Union類型
Union類型,即聯(lián)合類型,是由多個(gè)類型組合成的引用類型。聯(lián)合類型包含了變量可能的所有類型。使用type關(guān)鍵字進(jìn)行定義。
classCat{ name: string ='cat'; //...}classDog{ name: string ='dog'; //...}classFrog{ name: string ='frog'; //...}type Animal = Cat | Dog | Frog | number | string | null | undefined;//Cat、Dog、Frog是一些類型(類或接口)let animal: Animal = new Cat();animal = new Frog();animal =42;animal ='dog';animal = undefined;
// 可以將類型為聯(lián)合類型的變量賦值為任何組成類型的有效值可以使用不同機(jī)制獲取聯(lián)合類型中的特定類型值。
示例:
classCat{sleep() {}; meow () {} }classDog{sleep() {}; bark () {} }classFrog{sleep() {}; leap () {} }type Animal = Cat | Dog | Frog;function foo(animal: Animal) { if(animal instanceof Frog) { animal.leap(); //animal在這里是Frog類型 } animal.sleep();//Animal具有sleep方法}
2.4.9 Aliases類型
Aliases類型為匿名類型(如數(shù)組、函數(shù)、對(duì)象字面量或聯(lián)合類型)提供名稱,或?yàn)橐讯x的類型提供替代名稱。
typeMatrix=number[][];typeHandler=(s:string,no:number) =>string;typePredicate =(x: T) =>boolean;typeNullableObject=Object|null;
三、代碼講解
下面是一個(gè)綜合案例,演示了上述大部分知識(shí)點(diǎn)的實(shí)際應(yīng)用。
3.1 任務(wù)一:變量聲明與基本數(shù)據(jù)類型
這個(gè)任務(wù)將展示如何聲明和使用各種基本數(shù)據(jù)類型的變量和常量。
// ======== 任務(wù)一:變量聲明與基本數(shù)據(jù)類型 ========// 1. 使用 let 聲明可變變量,并進(jìn)行類型注解letstudentName:string="張三";letage:number=20;letisEnrolled:boolean=true;// 2. 使用 const 聲明常量(不可修改)constMAX_STUDENTS:number=100;constCOURSE_NAME:string="HarmonyOS應(yīng)用開發(fā)";// 3. 類型推斷 - 不顯式寫類型,讓編譯器自動(dòng)推斷l(xiāng)etcity ="北京";// 推斷為 stringletscore =95.5; // 推斷為 numberletisActive =false;// 推斷為 boolean// 4. 特殊類型:undefined 和 nullletuninitializedVar:undefined=undefined;letemptyValue:null=null;// 5. 在控制臺(tái)輸出所有變量及其類型console.log("=== 基本數(shù)據(jù)類型練習(xí) ===");// typeof 操作符可以獲取變量的類型console.log(`學(xué)生姓名:${studentName}, 類型:${typeofstudentName}`);console.log(`年齡:${age}, 類型:${typeofage}`);console.log(`是否注冊(cè):${isEnrolled}, 類型:${typeofisEnrolled}`);console.log(`最大人數(shù)限制:${MAX_STUDENTS}, 類型:${typeofMAX_STUDENTS}`);console.log(`課程名稱:${COURSE_NAME}, 類型:${typeofCOURSE_NAME}`);console.log(`所在城市:${city}, 類型:${typeofcity}`);console.log(`分?jǐn)?shù):${score}, 類型:${typeofscore}`);console.log(`是否活躍:${isActive}, 類型:${typeofisActive}`);console.log(`未初始化變量:${uninitializedVar}, 類型:${typeofuninitializedVar}`);console.log(`空值:${emptyValue}, 類型:${typeofemptyValue}`);// 嘗試修改常量的值 (取消注釋下面一行會(huì)報(bào)錯(cuò))// MAX_STUDENTS = 120;
3.2 任務(wù)二:數(shù)組與對(duì)象
這個(gè)任務(wù)將展示如何使用數(shù)組(Array)和對(duì)象(Object)來(lái)組織和管理更復(fù)雜的數(shù)據(jù)。我們還會(huì)引入 interface 來(lái)定義自定義的數(shù)據(jù)結(jié)構(gòu)。
// ======== 任務(wù)二:數(shù)組與對(duì)象 ========// 1. 數(shù)組聲明 - 使用類型注解// 字符串?dāng)?shù)組letfavoriteSubjects:string[] = ["數(shù)學(xué)","物理","信息技術(shù)"];// 數(shù)字?jǐn)?shù)組lettestScores:number[] = [88,92,76,95];// 2. 對(duì)象聲明 - 定義學(xué)生信息// 使用 interface 定義一個(gè)自定義類型,增強(qiáng)代碼可讀性和類型檢查interfaceContact{ phone:string; email:string;}// 定義一個(gè)更復(fù)雜的 StudentInfo 類型interfaceStudentInfo{ id:number; name:string; age:number; grades:number[]; // grades 屬性是一個(gè)數(shù)字?jǐn)?shù)組 hobbies:string[]; // hobbies 屬性是一個(gè)字符串?dāng)?shù)組 contact?:Contact; // contact 是一個(gè)可選屬性,使用 ? 標(biāo)記}// 根據(jù) interface 創(chuàng)建一個(gè)學(xué)生對(duì)象letstudent1:StudentInfo= { id:1001, name:"王五", age:19, grades: [85,90,88], hobbies: ["編程","籃球","音樂"] // contact 屬性可以暫時(shí)不提供};// 3. 訪問和修改對(duì)象屬性student1.age=20;// 修改年齡student1.hobbies.push("繪畫");// 向 hobbies 數(shù)組添加一個(gè)新元素// 4. 給對(duì)象添加可選的聯(lián)系信息student1.contact= { phone:"13800138000", email:"wangwu@example.com"};// 5. 數(shù)組方法練習(xí)testScores.push(89);// 向 testScores 數(shù)組添加一個(gè)新成績(jī)// 使用擴(kuò)展運(yùn)算符 (...) 和 Math.max 函數(shù)找出最高分lethighestScore =Math.max(...testScores);// 6. 輸出復(fù)雜類型數(shù)據(jù)console.log("\n=== 數(shù)組與對(duì)象練習(xí) ===");console.log("最喜歡的科目:", favoriteSubjects);console.log("測(cè)試成績(jī):", testScores);console.log("最高分:", highestScore);console.log("學(xué)生信息:");console.log(`ID:${student1.id}`);console.log(`姓名:${student1.name}`);console.log(`年齡:${student1.age}`);// 使用數(shù)組的 join 方法將數(shù)組轉(zhuǎn)為字符串console.log(`成績(jī):${student1.grades.join(", ")}`);console.log(`愛好:${student1.hobbies.join(", ")}`);// 安全地訪問可選屬性if(student1.contact) { console.log(`電話:${student1.contact.phone}`); console.log(`郵箱:${student1.contact.email}`);}else{ console.log("聯(lián)系方式: 未提供");}
3.3 UI 展示組件
最后,我們將所有定義的數(shù)據(jù)在 UI 界面上展示出來(lái)。
@Entry@ComponentstructMainPage{ build() { // 使用 Scroll 組件允許在內(nèi)容超出屏幕時(shí)滾動(dòng) Scroll() { // Column 組件將子元素垂直排列 Column({space:10}) { // --- 顯示基本類型信息 --- Text('=== 基本數(shù)據(jù)類型演示 ===') .fontSize(20) .fontWeight(FontWeight.Bold) Text(`學(xué)生姓名:${studentName}`) Text(`年齡:${age}`) // 使用三元運(yùn)算符將布爾值轉(zhuǎn)為易讀的文本 Text(`是否注冊(cè):${isEnrolled ?'是':'否'}`) Text(`課程名稱:${COURSE_NAME}`) Text(`所在城市:${city}`) Text(`分?jǐn)?shù):${score}`) Text(`是否活躍:${isActive ?'是':'否'}`) Text(`最大人數(shù)限制:${MAX_STUDENTS}`) // --- 顯示復(fù)雜類型信息 --- Text('\n=== 數(shù)組與對(duì)象演示 ===') .fontSize(20) .fontWeight(FontWeight.Bold) Text(`最喜歡科目:${favoriteSubjects.join(', ')}`) Text(`測(cè)試成績(jī):${testScores.join(', ')}`) Text(`最高分:${highestScore}`) Text('\n--- 學(xué)生信息 ---') Text(`ID:${student1.id}`) Text(`姓名:${student1.name}`) Text(`年齡:${student1.age}`) Text(`成績(jī):${student1.grades.join(', ')}`) Text(`愛好:${student1.hobbies.join(', ')}`) // 同樣,在UI中安全地訪問可選屬性 if(student1.contact) { Text(`電話:${student1.contact.phone}`) Text(`郵箱:${student1.contact.email}`) }else{ Text("聯(lián)系方式: 未提供") } // 添加一個(gè)空白組件,將內(nèi)容與底部拉開距離 Blank() } // 設(shè)置 Column 的寬度為父容器的 90% .width('90%') // 設(shè)置內(nèi)邊距 .padding(10) } }}
四、運(yùn)行結(jié)果
注:在開始本項(xiàng)目前,請(qǐng)參照DevEco Studio開發(fā)環(huán)境搭建完成環(huán)境搭建。
完成項(xiàng)目編譯后,在entry目錄下會(huì)出現(xiàn)build文件夾,參照下圖步驟將應(yīng)用安裝到設(shè)備或模擬器:


結(jié)果

-
編程語(yǔ)言
+關(guān)注
關(guān)注
10文章
1964瀏覽量
39552 -
變量
+關(guān)注
關(guān)注
0文章
616瀏覽量
29504 -
OpenHarmony
+關(guān)注
關(guān)注
33文章
3952瀏覽量
21089
發(fā)布評(píng)論請(qǐng)先 登錄
技術(shù)干貨驛站 ▏深入理解C語(yǔ)言:基本數(shù)據(jù)類型和變量
基于ArkTS語(yǔ)言的OpenHarmony APP應(yīng)用開發(fā):HelloOpenharmony
基于凌羽派的OpenHarmony北向應(yīng)用開發(fā):Hello World 示例應(yīng)用
基于凌羽派的OpenHarmony北向應(yīng)用開發(fā):ArkTS語(yǔ)法-數(shù)據(jù)類型和變量聲明
Verilog 變量聲明與數(shù)據(jù)類型二
Verilog 變量聲明與數(shù)據(jù)類型一
HarmonyOS/OpenHarmony應(yīng)用開發(fā)-ArkTS的聲明式開發(fā)范式
HarmonyOS/OpenHarmony應(yīng)用開發(fā)-ArkTS語(yǔ)言基本語(yǔ)法說(shuō)明
重視變量的數(shù)據(jù)類型
西門子博途中聲明STRUCT數(shù)據(jù)類型的變量
ARRAY 數(shù)據(jù)類型的變量
C語(yǔ)言數(shù)據(jù)類型有哪些
基于ArkTS語(yǔ)言的OpenHarmony APP應(yīng)用開發(fā):HelloOpenharmony
基于凌羽派的OpenHarmony北向應(yīng)用開發(fā):Hello World 示例應(yīng)用
基于凌羽派的OpenHarmony北向應(yīng)用開發(fā):ArkTS語(yǔ)法-數(shù)據(jù)類型和變量聲明
評(píng)論