二級域名 電子商務(wù)網(wǎng)站推廣方案網(wǎng)絡(luò)營銷師培訓(xùn)費用是多少
ArkTS是HarmonyOS的主要應(yīng)用開發(fā)語言,在TypeScript基礎(chǔ)上進行了擴展,保留了其基本風(fēng)格,并通過增強靜態(tài)檢查和分析來提高程序的穩(wěn)定性和性能。本教程將幫助開發(fā)者掌握ArkTS的核心功能、語法及最佳實踐,以便高效地構(gòu)建高性能移動應(yīng)用。
1. 基本語法
1.1. 字面量
字面量(Literal)是一種直接表示在源代碼中的固定值,不同類型的字面量格式有所不同,下面是ArkTS中各類型字面量的表示方式。
- 數(shù)值型字面量
-
- 整數(shù):數(shù)學(xué)中的整數(shù)(例如:8, 15, 123)
- 浮點數(shù):帶有小數(shù)點的數(shù)字(例如:8.15, 1.234)
- 字符串型字面量:用單引號或雙引號括起來的文本(例如:'abc', "你好世界")
- 布爾型字面量:表示真假(例如:true, false)
//1.整數(shù)型字面量
console.log('整數(shù):',60); //60//2.浮點型字面量
console.log('浮點數(shù):',3.14) //3.14
console.log('浮點數(shù):',.14) //0.14
console.log('浮點數(shù):',1e2) //100//3.布爾型字面量
console.log('布爾型:',true) //true
console.log('布爾型:',false) //false//4.字符串型字面量
console.log('字符串:','Hello ArkTS') //Hello ArkTS
console.log('字符串:',"Hello HarmonyOS") //Hello HarmonyOS
1.2. 變量
在計算機語言中,變量可以理解為存儲數(shù)據(jù)的容器。在ArkTS中定義變量的格式如下
let 變量名: 類型 = 值int a = 10; //Java
let a:number = 10 //ArkTS
例:比如在華為商城中有很多商品,我們現(xiàn)在想定義一個變量,用來存儲商品的標(biāo)題
定義各種類型的變量
let title: string = 'HUAWEI Mate 60 Pro'
console.log(title)
1.3. 類型
ArkTS是一種靜態(tài)類型的語言,定義變量時必須明確數(shù)據(jù)類型。 ArkTS支持的數(shù)據(jù)類型有以下幾種
number 類型
number 用于表示數(shù)字,包括整數(shù)和浮點數(shù)。
let num: number = 10;
let floatNum: number = 3.14;
string 類型
string 用于表示文本數(shù)據(jù),可以包含字母、數(shù)字、符號和空格等??梢允褂脝我?#xff08;')、雙引號(")或反引號(`)來聲明字符串。反引號內(nèi)可以嵌入表達式,形成模板字符串。
let name: string = 'ArkTS!';
let desc: string = "ArkTS是HarmonyOS的主要應(yīng)用開發(fā)語言"
let templateStr: string = `Hello,${name}. ${desc}`
boolean 類型
boolean 用于表示邏輯上的真值和假值。只有兩個值:true
和 false
。
let isDone: boolean = false;
array 類型
array即數(shù)組,它是一個存儲數(shù)據(jù)的容器,數(shù)組的長度由數(shù)組中元素的個數(shù)來確定。數(shù)組中第一個元素的索引為0。
let names: string[] = ['Alice', 'Bob', 'Carol'];
names[0] = "愛麗絲"
console.log(names[0])
enum類型
enum類型,又稱枚舉類型,是預(yù)先定義的一組命名值的值類型,其中命名值又稱為枚舉常量。
使用枚舉常量時必須以枚舉類型名稱為前綴。
enum ColorSet { Red, Green, Blue
}
let c: ColorSet = ColorSet.Red;
常量表達式可以用于顯式設(shè)置枚舉常量的值。
enum ColorSet { White = 0xFF, Grey = 0x7F, Black = 0x00
}
let c: ColorSet = ColorSet.Black;
union類型
union類型,即聯(lián)合類型,是由多個類型組合成的引用類型。聯(lián)合類型可以包含了變量可能的所有類型
type Type = string | number | ColorSet | string[] | ColorSet[]let a1: Type = "red" //正確
let a2: Type = 0xff00 //正確
let a3: Type = ColorSet.Red //正確
let a4: Type = ["red", "balck"] //正確
let a5: Type = [ColorSet.Red] //正確
let a6: Type = true //錯誤
Aliases類型
Aliases類型為別名類型,可以為已有類型提供替代名稱,或者為匿名類型(數(shù)組、函數(shù)、對象字面量或聯(lián)合類型)提供名稱。
// 為number類型取一個別名為int
type int = number
let a: number = 10
let b: int = 10
1.4. 常量
常量是不會發(fā)生改變的數(shù)據(jù),它只能被賦值一次。定義格式如下
const 變量名: 類型 = 值
例:在數(shù)學(xué)中有一個非常重要的常量,就是圓周率π
const PI: number = 3.1415926
PI = 31.4 //這是錯誤的,變量的值只能被賦值一次。
1.5. 類型推斷
由于ArkTS是一種靜態(tài)類型語言,所有數(shù)據(jù)的類型都必須在編譯時確定。但是,如果一個變量或常量的聲明包含了初始值,那么開發(fā)者就不需要顯式指定其類型。
//以下兩種定義變量的方式都可以
let a1: number = 10
let a2 = 10
1.6. 命名規(guī)范
不管定義變量還是定義常量,取名也是不是亂取的,是有一些命名規(guī)則的,必須遵守這些規(guī)則,否則代碼編譯不通過。
1. 只能包含數(shù)字、字母、下劃線、$,不能以數(shù)字開頭
2. 不能使用內(nèi)置關(guān)鍵字或者保留字
3. 嚴(yán)格區(qū)分大小寫
1.7. undefined 空值
先說結(jié)論,undefined表示一個變量它的值為“空值”,意思就是這個變量沒有值,其它就是undefined。
有下面幾種情況,變量的值是undefined.
情況一:變量沒有顯示的賦值,其值默認就是undefined
變量沒有顯示的賦值,但是直接使用這個變量是不推薦的,所以編譯器會報錯。為了驗證上面的結(jié)論,我們可以使用強制斷言符號“!”,強制編譯通過。
let a: string
console.info(`${a}`) //編譯報錯
console.info(`${a!}`) //編譯通過,輸出undefinedlet b: number
console.info(`${b!}`) //編譯通過,輸出undefined
情況二:變量沒有顯示賦值,但是明確聲明類型可以是undefined,其值默認也是undefined
let a: string | undefined
console.info(`${a}`) //編譯通過,輸出undefinedlet b: number | undefined
console.info(`$`) //編譯通過,輸出undefined
情況三:變量顯示賦值為undefined,其類型必須聲明為undefined類型
let a: string = undefined //編譯錯誤
let b: string | undefined = undefined
console.info(`${a}`) //編譯通過,輸出undefined
注意:不管是前面那種情況,在后續(xù)代碼中都可以給值為undefined的變量賦值。
let a: string
let b: number | undefined
let c: boolean | undefined = undefined
console.info(`${a!}`) //輸出undefined
console.info(`$`) //輸出undefined
console.info(`${c}`) //輸出undefined
a = 'hello'
b = 20
c = true
console.info(`${a}`) //輸出hello
console.info(`$`) //輸出20
console.info(`${c}`) //輸出true
1.8. 數(shù)組
數(shù)組是能夠存儲0個或者多個數(shù)據(jù)的容器。下面兩種格式都可以定義數(shù)組
let 數(shù)組名: Array<類型> = [值1, 值2, 值3];
let 數(shù)組名: 類型[] = [值1,值2,值3]
例:定義一個數(shù)組,用來存儲班級中學(xué)生的姓名
let names1: Array<string> = ['小明','小黃','阿珍','阿強']
let names2: string[] = ['小明','小黃','阿珍','阿強']
例:定義數(shù)組也可以使用類型推斷,省略數(shù)據(jù)類型
let names3 = ['小明','小黃','阿珍','阿強']
數(shù)組中存儲的數(shù)據(jù)統(tǒng)稱為元素,每一個元素都會有一個唯一的索引編號,通過數(shù)組名[索引]
就可以找到任意一個元素。
console.log(‘names2[0]’,names2[0]) //小明
names2[1] = ‘大黃’
console.log(‘names2[1]’,names2[1]) //大黃
console.log(‘names2[2]’,names2[2]) //阿珍
console.log(‘names2[3]’,names2[3]) //阿強
1.9. 運算符
運算符(Operator)是一種告訴編譯器執(zhí)行特定數(shù)學(xué)或邏輯操作的符號。任何一門計算機語言運算操作基本上是一樣的。
1.9.1. 算術(shù)運算符
所有算術(shù)運算符如下表所示
運算符 | 含義 |
+ | 加法運算、字符串拼接 |
- | 減法運算 |
* | 乘法運算 |
/ | 除法運算,整數(shù)相除只能得到整數(shù) |
% | 取模(余數(shù)) |
++ | 自增運算(在原來數(shù)據(jù)的基礎(chǔ)上+1) |
-- | 自減運算(在原來數(shù)據(jù)的基礎(chǔ)上-1) |
以上運算符都比較簡單,下面重點講解一下++或者--運算符的運算規(guī)則。
- 單獨使用:不斷++或者--放在操作數(shù)的前面還是后面,都表示對操作數(shù)自增1或者自減1
let x = 3 let y = ++x //a先+1,再把a的結(jié)果賦值給b console.log(`x的值為${x}`) //x的值為4 console.log(`y的值為${y}`) //y的值為4
- 混合使用:++和--可以放在變量前面或者后面,運算順序有所不同
let i = 3 let j = i++ //先把i的值賦值給j,i再+1 console.log(`i的值為${i}`) //x的值為4 console.log(`j的值為${j}`) //y的值為3
-
let i = 3 let j = i++ //先把i的值賦值給j,i再+1 console.log(`i的值為${i}`) //x的值為4 console.log(`j的值為${j}`) //y的值為3
-
1.9.2. 賦值運算符
賦值運算就是把具體數(shù)據(jù)值賦值給變量,有下面的幾個運算
運算符
含義
=
把右邊的值賦值給左邊
+=
左右兩邊相加的結(jié)果賦值給左邊
-=
左右兩邊相減的結(jié)果賦值給左邊
*=
左右兩邊相乘的結(jié)果賦值給左邊
/=
左右兩邊相除的結(jié)果賦值給左邊
%=
左右兩邊取余數(shù)的結(jié)果賦值給左邊
1.9.3. 比較運算符
用來對兩個數(shù)據(jù)做比較運算,最終結(jié)果只能是true或者false。需要注意的是==和=千萬不要搞混淆了
- = 用于賦值
- == 用于判斷兩個數(shù)據(jù)是否相等
運算符 | 含義 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
== | 先轉(zhuǎn)換類,再判斷相等 |
!= | 判斷不相等 |
let a2 = 10
let b2 = 10
let c2 = a2==b2
console.log(`c2的值為${c2}`) //c2的值為true
1.9.4. 邏輯運算符
邏輯運算可以對多個條件進行連接,最終結(jié)果也是true或者false
運算符 | 含義 |
&& | 兩個條件都滿足結(jié)果才是true |
|| | 有一個條件滿足結(jié)果就是true |
! | 對結(jié)果取反 |
let a3=3;
let b3=4;
let c3=5;
//&&(雙與): 左右兩邊都是true,結(jié)果才是true。
console.log('邏輯運算',a3>b3 && b3<c3) //false
console.log('邏輯運算',a3<b3 && b3<c3) //true//||(雙或): 左右兩邊有一個是true,結(jié)果就是true。
console.log('邏輯運算',a3>b3 || b3>c3) //false
console.log('邏輯運算',a3<b3 || b3<c3) //true//!(非): 對值取反
console.log('邏輯運算',!(a3<b3)) //false
1.10. 流程語句
1.10.1. if語句
if語句用于需要根據(jù)邏輯條件執(zhí)行不同語句的場景。當(dāng)邏輯條件為真時,執(zhí)行對應(yīng)的一組語句,否則執(zhí)行另一組語句(如果有的話)。else部分也可能包含if語句。
if語句如下所示:
if (condition1) {// 語句1
} else if (condition2) {// 語句2
} else {// else語句
}
條件表達式可以是任何類型。但是對于boolean以外的類型,會進行隱式類型轉(zhuǎn)換:
let s1 = 'Hello';
if (s1) {console.log(s1); // 打印“Hello”
}let s2 = 'World';
if (s2.length != 0) {console.log(s2); // 打印“World”
}
1.10.2. switch語句
使用switch語句來執(zhí)行與switch表達式值匹配的代碼塊。switch語句如下所示:
switch (expression) {case label1: // 如果label1匹配,則執(zhí)行// ...// 語句1// ...break; // 可省略case label2:case label3: // 如果label2或label3匹配,則執(zhí)行// ...// 語句23// ...break; // 可省略default:// 默認語句
}
如果switch表達式的值等于某個label的值,則執(zhí)行相應(yīng)的語句。
如果沒有任何一個label值與表達式值相匹配,并且switch具有default子句,那么程序會執(zhí)行default子句對應(yīng)的代碼塊。
break語句(可選的)允許跳出switch語句并繼續(xù)執(zhí)行switch語句之后的語句。
如果沒有break語句,則執(zhí)行switch中的下一個label對應(yīng)的代碼塊。
1.10.3. 條件表達式
條件表達式由第一個表達式的布爾值來決定返回其它兩個表達式中的哪一個。
數(shù)據(jù)類型 變量名 = 條件表達式 ? 值1 : 值2;
- 執(zhí)行流程:
-
- 判斷關(guān)系表達式的結(jié)果是true還是false
- 如果關(guān)系表達式是true,三元運算的結(jié)果就是表達式1
- 如果關(guān)系表達式是false,三元運算的結(jié)果就是表達式2
?//例1:求兩個變量的最大值 let n = 20; let m = 30; //三元運算的結(jié)果 被max接收 let max = n > m ? n : m console.log('三元運算', max) //30//例2:判斷成績是否及格 let score = 90 console.log('三元運算', score>=60?'及格':'不及格') //及格
1.10.4. for語句
for語句會被重復(fù)執(zhí)行,直到循環(huán)退出語句值為false。for語句如下所示:
?for ([init]; [condition]; [update]) {statements }
for語句的執(zhí)行流程如下:
1、 執(zhí)行init表達式(如有)。此表達式通常初始化一個或多個循環(huán)計數(shù)器。
2、 計算condition。如果它為真值(轉(zhuǎn)換后為true的值),則執(zhí)行循環(huán)主體的語句。如果它為假值(轉(zhuǎn)換后為false的值),則for循環(huán)終止。
3、 執(zhí)行循環(huán)主體的語句。
4、 如果有update表達式,則執(zhí)行該表達式。
5、 回到步驟2。
示例:
let sum = 0; for (let i = 0; i < 10; i += 2) {sum += i; }
1.10.5. for-of語句
使用for-of語句可遍歷數(shù)組或字符串。示例如下:
for (forVar of expression) {statements }
示例:
?let array = ['你好', '鴻蒙', 'HarmonyOS']; for (let s of array) {console.log(s); //'你好', '鴻蒙', 'HarmonyOS' }
1.10.6. while語句
只要condition為真值(轉(zhuǎn)換后為true的值),while語句就會執(zhí)行statements語句。示例如下:
?while (condition) {statements }
示例:
?let n = 0; let x = 0; while (n < 3) {n++;x += n; }
1.10.7. do-while語句
如果condition的值為真值(轉(zhuǎn)換后為true的值),那么statements語句會重復(fù)執(zhí)行。示例如下:
?do {statements } while (condition)
示例:
let i = 0; do {i += 1; } while (i < 10)
1.10.8. break語句
使用break語句可以終止循環(huán)語句或switch。
示例:
?let x = 0; while (true) {x++;if (x > 5) {break;} }
如果break語句后帶有標(biāo)識符,則將控制流轉(zhuǎn)移到該標(biāo)識符所包含的語句塊之外。
示例:
let x = 1 label: while (true) {switch (x) {case 1:// statementsbreak label; // 中斷while語句} }
1.10.9. continue語句
continue語句會停止當(dāng)前循環(huán)迭代的執(zhí)行,并繼續(xù)執(zhí)行下一次循環(huán)。
示例:
let sum = 0; for (let x = 0; x < 100; x++) {if (x % 2 == 0) {continue}sum += x; }
1.11. 函數(shù)
1.11.1. 函數(shù)概述
函數(shù)是可以被重復(fù)使用的代碼塊,它可以接受輸入?yún)?shù),執(zhí)行一系列操作,然后返回輸出結(jié)果。
為了方便大家理解,我想到一個非常形象的生活案例幫助大家理解;如下圖所示,有一個包餃子神器,當(dāng)我們需要包餃子時,準(zhǔn)備好餃子皮和餃子餡,放在包餃子神器上一夾,一個完整的餃子就做出來了。
在這個案例中,包餃子神器就是一個可以重復(fù)利用的函數(shù),餃子皮和陷就是函數(shù)接受的參數(shù),而“夾”這個動作就是函數(shù)執(zhí)行的操作,做出來的餃子就是函數(shù)的返回結(jié)果。
函數(shù)必須先聲明才能使用,函數(shù)聲明包含其名稱、參數(shù)列表、返回類型和函數(shù)體。下面是函數(shù)聲明的格式function 函數(shù)名(形參1: 類型1,形參2: 類型2): 返回值類型{....return 結(jié)果; }
例:聲明一個函數(shù),能夠接受兩個整數(shù),執(zhí)行求和的操作,并返回兩個數(shù)的和。
function add(x:number, y: number): number{let z = x+y;return z; }
1.11.2. 函數(shù)調(diào)用
注意函數(shù)聲明好了,必須調(diào)用才能執(zhí)行。下面演示函數(shù)的調(diào)用
?let s = add(3,4) //調(diào)用add函數(shù),求3與4的和,并把和值賦值給變量s console.log(”兩個數(shù)的和為:",s)let s1 = add(4,6) //重復(fù)調(diào)用add函數(shù) console.log(”兩個數(shù)的和為:",s1)
1.11.3. 無返回值函數(shù)
函數(shù)可以沒有返回值,此時方法體內(nèi)不需要寫return語句,返回值類型用void代替
例:聲明一個函數(shù),能夠接受兩個整數(shù),執(zhí)行求最和操作,直接和在函數(shù)內(nèi)打印輸出。
//聲明函數(shù) function max(x:number, y: number): void{let z = x+y;console.log(”兩個數(shù)的最大:",z) } //調(diào)用函數(shù) max(3,4) max(4,6)
1.11.4. 無參數(shù)函數(shù)
函數(shù)可以不接受輸入數(shù)據(jù),此時()中什么都不寫,調(diào)用函數(shù)時也不用傳遞參數(shù)。
例:聲明一個函數(shù),打印10個“Hello HarmonyOS”
//聲明函數(shù) function print(){for (let i=0; i<10;i++){console.log('Hello HarmonyOS')} }//調(diào)用函數(shù) print()
1.11.5. 返回類型推斷
如果可以從函數(shù)體內(nèi)推斷出函數(shù)返回類型,則可在函數(shù)聲明中省略標(biāo)注返回類型。
// 顯式指定返回類型 function foo(): string {return 'foo'; }// 推斷返回類型為string function goo() {return 'goo'; }
1.11.6. 箭頭函數(shù)
箭頭函數(shù)(又名Lambda函數(shù)),它是一種比普通函數(shù)更加簡潔的函數(shù)寫法。
箭頭函數(shù)的格式let 函數(shù)名 = (參數(shù)列表):返回值類型=>{函數(shù)的執(zhí)行代碼return 結(jié)果 }
例:使用箭頭函數(shù),矩形的面積
//聲明箭頭函數(shù) let rectArea = (width: number, height: number): number => { return width * height }//調(diào)用箭頭函數(shù) let s1: number = rectArea(100,50)
箭頭函數(shù)的返回值類型可以省略,省略時,返回值通過類型推斷;
?//聲明箭頭函數(shù) let rectArea = (width: number, height: number) => { return width * height }//調(diào)用箭頭函數(shù) let s1 = rectArea(100,50)
如果箭頭函數(shù)的函數(shù)體語句只有一條,{}、return也可以省略
//聲明箭頭函數(shù) let rectArea = (width: number, height: number) => width * height //調(diào)用箭頭函數(shù) let s2 = rectArea(100,50)
1.11.7. 可選參數(shù)
在參數(shù)名稱后面加上
?
表示參數(shù)是可選的,意思就是調(diào)用時可以傳遞參數(shù),也可以不傳遞參數(shù)。
?function buildName(firstName: string, lastName?: string) {if (lastName)return firstName + " " + lastName;elsereturn firstName; }let result1 = buildName("李"); // 正確 let result2 = buildName("李", "世明"); // 正確
1.11.8. 可變參數(shù)
可變參數(shù)指的是可以讓函數(shù)接受任意數(shù)量的參數(shù)??勺儏?shù)其本質(zhì)是一個數(shù)組。
// 需求:定義函數(shù),求任意幾個數(shù)據(jù)的和 function sum(...numbers: number[]): number {let sum = 0;for (let num of numbers) {sum += num;}return sum; }// 調(diào)用函數(shù),傳入任意數(shù)量的參數(shù) let res1 = sum(1, 2, 3) let res2 = sum(1, 2, 3, 4, 5, 6)