前面学习了一个简单的例子,这是多年来学习应用程序开发的经典路径,在这里也是这种待遇,通过这样的学习明白了一个简单应用是怎么样构成的,知道它是怎么运行输出的。在这个基础之上,你还是不会开发应用程序的,因为你还没有学习鸿蒙应用的开发语言基础,所以在这里要学习一下ArkTS语言的基础知识,才能自己写出应用程序来。需要自己不断运用上面的例子来测试自己学习的语言知识,然后才可以写出高端大气上档次的应用。ArkTS是一种为构建高性能应用而设计的编程语言。ArkTS在继承TypeScript语法的基础上进行了优化,以提供更高的性能和开发效率。
数据类型是构成程序的基本要素,因此每一门语言都有自己的数据类型定义,并且符合这种规则的数据类型才能识别出来。
先来看一下ArkTS命名规则:
1)变量名称可以包含数字和字母。
2)变量名不能以数字开头。
3)除了下划线 _ 和美元 $ 符号外,不能包含其他特殊字符,包括空格。
4)不能使用关键字和保留字(已经定义了特殊含义的单词)
5)见名知意
程序都需要开发人员来定义一个名称,用来保存数据,其实就相当于声明一段内存用于储存数据。我们知道计算都需要有内存,内存很大,在程序运行时需要指定放在某个位置,所以就要声明变量。
定义名称可以包含数字和字母,比如下面这些都是合法:
这里先定义了一个函数,这个函数是在自定义组件内部,这样方便我们测试所学习的内容,比如后学习的数据类型。在函数内编写自己学习最新的知识,在上面定义了三个变量,这三个变量都是没有关键字在前面声明,跟js不一样的地方,这点要牢记。第一个变量msg是声明一个字符串变量,它采用关键字var来声明,在这里省略了字符串的类型string,完整的类型应该是这样:
var msg: string = '测试';
如果这个变量类型有初值,就可以采用省略的方式,如果没有初值就不能省略它,一定要写完整。
第二个变量msg1是声明一个数字类型,也即是number类型。这类型可以表示整数和浮点数。
第三个变量msg_1也是声明一个数字类型,但是它采用let关键字来声明。其实let与var关键字还是会有一些区别,这里暂时先不管,后面再来理解这种的区别。
比如下面的变量声明就是错误的:
第一个变量的错误原因是因为使用数字开头;第二个变量错误是使用&这样特殊字符开头;第三个变量是使用关键字var作为变量名称,关键字是保留作为语言特殊作用的,不声明为变量使用。
上面学习了变量命名规则。这些内容是要非常熟悉的,必须多学习和记忆。
接着下来我们需要学习ArkTS数据类型,首先来学习字符串类型(string)。
String类型
string代表字符序列;可以使用转义字符来表示字符。
字符串字面量由单引号(‘)或双引号(’)之间括起来的零个或多个字符组成。字符串字面量还有一特殊形式,是用反向单引号(`)括起来的模板字面量。
比如前面已经接触过的语句:
@State message: string = 'Hello World'
这里就是声明一个组件里的属性message,@State是一个装饰器,用来告诉UI这个变量改变时,就需要更新UI界面。属性变量message定义为一个string类型,它保存的内容是 'Hello World',这个字符串是使用单引号来声明的。其实也可以使用双引号来声明字符串。
变量声明的格式如下:
这种形式是局部变量的声明,第一个是关键let,变量名称叫做msg, 变量类型是string,赋值符号为等号,后面赋值内容。
如果声明在对象内部的属性,就不能添加let关键字在前面,比如前面的属性message,它是属于struct Index组件。
下面就是一些字符串类型的定义:
Number类型
ArkTS提供number和Number类型,任何整数和浮点数都可以被赋给此类型的变量。
数字字面量包括整数字面量和十进制浮点数字面量。
整数字面量包括以下类别:
由数字序列组成的十进制整数。例如:0、117、-345
以0x(或0X)开头的十六进制整数,可以包含数字(0-9)和字母a-f或A-F。例如:0x1123、0x00111、-0xF1A7
以0o(或0O)开头的八进制整数,只能包含数字(0-7)。例如:0o777
以0b(或0B)开头的二进制整数,只能包含数字0和1。例如:0b11、0b0011、-0b11
浮点字面量包括以下:
十进制整数,可为有符号数(即,前缀为“+”或“-”);
小数点(“.”)
小数部分(由十进制数字字符串表示)
以“e”或“E”开头的指数部分,后跟有符号(即,前缀为“+”或“-”)或无符号整数。
下面就是一些数字类型的例子:
又比如在函数中的声明:
function factorial(n: number): number {
if (n <= 1) {
return 1
}
return n * factorial(n - 1)
}
上面函数定义的函数参数n就是一个number类型。
// 数值类型
let num1: number = 18 //十进制
let num2: number = 0b10011 //ob 二进制
let num3: number = 0o1234567 // 0o 八进制
let num4: number = 0x123abcdef //0x 十六进制
这些也是数字类型的定义。
boolean布尔值
ArkTS中可以使用boolean来表示这个变量是布尔值,可以赋值为true或者false。
// 布尔类型 true false
let stateOn: boolean = true
let stateOff: boolean = false
boolean类型由true和false两个逻辑值组成。
通常在条件语句中使用boolean类型的变量:
let isDone: boolean = false
// ...
if (isDone) {
console.log ('Done!')
}
这里定义的isDone就是一个布尔变量。
数组
有两种表示方式:第一种在元素后面添加[]; 第二种方式,使用数组泛型,Array<元素类型>。
let list1 :number[] = [1,3,5];
let list2 :Array<number> = [1,3,5];
// 数组
let course1: Array<string> = ['入门',"基础语法",`组件`]
let course2: string[] = ['动画',"网络",`存储`]
array,即数组,是由可赋值给数组声明中指定的元素类型的数据组成的对象。 数组可由数组复合字面量(即用方括号括起来的零个或多个表达式的列表,其中每个表达式为数组中的一个元素)来赋值。数组的长度由数组中元素的个数来确定。数组中第一个元素的索引为0。
元组
元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。 比如,你可以定义一对值分别为 string和number类型的元组。
let x: [string, number];
x = ['hello', 10]; // OK
x = [10, 'hello']; // Error
@State x: [string, number] = ["hello", 123];
联合类型
联合类型(Union Types)表示取值可以为多种类型中的一种。
union类型,即联合类型,是由多个类型组合成的引用类型。联合类型包含了变量可能的所有类型。
let unionType: string | number |boolean
unionType = 'seven'
unionType = 7
unionType = true
比如下面的例子:
class Cat {
// ...
}
class Dog {
// ...
}
class Frog {
// ...
}
type Animal = Cat | Dog | Frog | number
// Cat、Dog、Frog是一些类型(类或接口)
let animal: Animal = new Cat()
animal = new Frog()
animal = 42
// 可以将类型为联合类型的变量赋值为任何组成类型的有效值
任意类型(any)
存在一些情况,在编程阶段我们并不能给编译器一个明确的数据类型。那么我们可以使用any来表示数据类型。就比如any在一个杂糅着多种数据类型的数组里就十分好用。
// 动态类型,ans
@State ns1: any[] = [false,12, "你好", [123,2,3] ];
build() {
Row() {
Column() {
ForEach(this.ns1, (item, i) => {
Text(`${i} - ${typeof item} - ${item}`)
});
}.width('100%')
}.height('100%')
}
又如下面的例子:
//any:不确定类型 可以是任意类型
let a:any = 'hello'
a=20
对象类型
在ArkTs中,不管你是一个普通的对象,还是一个数组,元组,集合等等,都是一个对象类型。
//object:对象
let o = {name:'zs',age:12}
console.log(o.name)
console.log(o['name'])
Object类型是所有引用类型的基类型。任何值,包括基本类型的值(它们会被自动装箱),都可以直接被赋给Object类型的变量。
枚举
enum类型是对JavaScript标准数据类型的一个补充,使用枚举类型可以为一组数值赋予友好的名字。
enum Color { Red, Green, Blue }
let c: Color = Color.Red
Unknown
有时候,我们会想要为那些在编程阶段还不清楚类型的变量指定一个类型。这种情况下,我们不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段的检查。那么我们可以使用unknown类型来标记这些变量。(同any)
let notSure: unknown = 4;
notSure = 'maybe a string instead';
notSure = false;
let unknownValue: unknown = 'hello';
let strValue: string = unknownValue; // 报错
Void
当一个函数没有返回值时,你通常会见到其返回值类型是 void。
function test(): void {
console.log('This is function is void');
}
void类型用于指定函数没有返回值。 此类型只有一个值,同样是void。由于void是引用类型,因此它可以用于泛型类型参数。
class Class<T> {
//...
}
let instance: Class <void>
Null 和 Undefined
TypeScript里,undefined和null两者各自有自己的类型分别叫做undefined和null。
let u: undefined = undefined;
let n: null = null;
null类型与undefined类型有许多相似之处
null类型只能被赋值null
undefined类型只能被赋值undefined
// Null 和 Undefined
@State n: null = null;
@State u: undefined = undefined;
上面就是ArkTS的基本数据类型,这些都是必须要学会的内容,如果对这些不熟悉是无法编写程序的。
在Typescript中,可以使用let、const和var关键字声明变量。其中,let和const是ES6新增的关键字,var是ES5中的关键字。
let关键字
let关键字用于声明块级作用域的变量。例如:
if (true) {
let x = 10;
}
console.log(x); // 报错,x未定义
const关键字
const关键字用于声明常量,一旦赋值就不能再修改。例如:
const PI = 3.14;
PI = 3; // 报错,常量不能修改
var关键字
var关键字用于声明全局作用域或函数作用域的变量。例如:
function test() {
var x = 10;
}
console.log(x); // 报错,x未定义