data-type.md 7.3 KB
Newer Older
D
DCloud_LXH 已提交
1 2 3 4
## 数据类型@data-type

### 布尔值(Boolean)

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
5 6 7 8 9 10
布尔是简单的基础类型,只有2个值分别是:`true``false`

```ts
let a:boolean = true
let b = false
```
D
DCloud_LXH 已提交
11 12 13

### 数字(Number)

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
14 15 16 17 18
在web中,数字不区分整型和浮点。但在kotlin和swift中,数字需要是一个确定类型,比如Int、Float,没有泛数字。

UTS 在iOS和Android平台上新增了 number,拉齐了web端的实现,方便开发者写全端兼容代码。

Number是一个泛数字类型,包括整数或浮点数,包括正数负数。例如: 正整数 `42` 或者 浮点数 `3.14159` 或者 负数 `-1`
D
DCloud_LXH 已提交
19 20

```ts
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
21
// 以下都是number类型
D
DCloud_LXH 已提交
22
let a:number = 42
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
23 24 25
let b:number = 3.14159
let c = 42
let d = 3.14159
D
DCloud_LXH 已提交
26 27
```

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
28
注意:在UTS中,Number 是基本数据类型,是默认数字类型,开发者书写的字面量如果没有特别指定类型也自动识别为Number。
杜庆泉's avatar
杜庆泉 已提交
29

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
30
除了 number,UTS 在Android和iOS设备上,也可以使用kotlin和swift的专用数字类型:
杜庆泉's avatar
杜庆泉 已提交
31

D
DCloud_LXH 已提交
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
#### Kotlin 特有的数字类型 @Kotlin

- Byte, UByte
- Short, UShort
- Int, UInt
- Long, ULong
- Float
- Double

#### Swift 特有的数字类型 @Swift

- Int, UInt, Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64
- Float, Float16, Float32, Float64
- Double

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
47 48 49
**特有数字类型的使用场景**

大多数场景下,开发者使用 字面量(即Number类型)就可以满足需要,但是也有需要特有数字类型的场景。
D
DCloud_LXH 已提交
50

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
51 52 53 54 55 56
1. 在 kotlin 和 swift 中,有些系统API或三方SDK的传入和返回强制约定了这些平台特有数字类型,此时无法使用number。
2. number作为泛数字,性能还是弱于Int。在普通计算中无法体现出差异,但在千万次运算后,累计会产生毫秒级速度差异。

当需要特有数字类型时,UTS中可以直接定义<!--,也可以通过number类型转换为特有数字类型。-->

可以使用下面的方法,虽然可能会被编辑器报语法错误(后续HBuilderX会修复这类误报),但编译到 kotlin 和 swift 时是可用的。
D
DCloud_LXH 已提交
57 58

- 声明特定的平台数字类型
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
59
 > 目前这些特有数字类型,声明类型时,与 number 不同的是,均为首字母大写
D
DCloud_LXH 已提交
60 61 62 63 64 65 66 67

```ts

let a:Int = 3 //注意 Int 是首字母大写
let b:Int = 4
let c:Double  = a * 1.0 / b
```

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
68 69 70 71
* 注意这些特有数字类型不能在web端和小程序端使用,如工程需兼容非App端,要把这些代码放入条件编译;
* iOS和Android都有的类型,比如Int,编译后可跨2个平台;但如果使用了某平台专有的数字类型,比如swift的Int8,则此代码不能编译到Android,工程如需支持Android,则把这些代码写在条件编译里。


D
DCloud_LXH 已提交
72 73 74 75 76 77 78 79 80 81 82 83
- 在 kotlin(app-android) 下转换特定的平台数字类型
```ts
let a:Int = 3
a.toFloat() // 转换为 Float 类型,后续也将支持 new Float(a) 方式转换
a.toDouble() // 转换为 Double 类型,后续也将支持 new Double(a) 方式转换
```

- 在 swift(app-ios) 下转换特定的平台数字类型
```ts
let a:Int = 3
let b = new Double(a) // 将整型变量 a 转换为 Double 类型
```
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
84 85 86 87

<!-- #### number和特有数字类型互转 -->

#### 边界情况说明:
D
DCloud_LXH 已提交
88 89 90 91 92 93

- 在不同平台上,数值的范围限制不同,超出限制会导致相应的错误或异常
  * 编译至 JavaScript 平台时,最大值为 1.7976931348623157e+308,最小值为 -1.7976931348623157e+308,超出限制会返回 `Infinity``-Infinity`
  * 编译至 Kotlin 平台时,最大值为 9223372036854775807,最小值为 -9223372036854775808,超出限制会报错:`The value is out of range‌`
  * 编译至 Swift 平台时,最大值 9223372036854775807,最小值 -9223372036854775808,超出限制会报错:`integer literal overflows when stored into Int`

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
94 95 96
#### 更多API
number内置对象还有一些API,[详见](buildin-object-api/number.md)

D
DCloud_LXH 已提交
97 98 99 100 101 102 103 104 105 106 107 108 109
### 字符串(String) @String

字符串是一串表示文本值的字符序列,例如:`"hello world"`

边界情况说明:

- 在不同平台上,字符串的长度限制不同,超出限制会导致相应的错误或异常
  * 编译至 JavaScript 平台时,最大长度取决于 JavaScript 引擎,例如在 V8 中,最大长度为 2^30 - 25,超出限制会报错:`Invalid string length`;在 JSCore 中,最大长度为 2^31 - 1,超出限制会报错:`Out of memory __ERROR`
  * 编译至 Kotlin 平台时,最大长度受系统内存的限制,超出限制会报错:`java.lang.OutOfMemoryError: char[] of length xxx would overflow`
  * 编译至 Swift 平台时,最大长度也受系统内存的限制,超出限制目前没有返回信息。

### 日期(Date)@date

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
110
日期对象表示日期,包括年月日时分秒等各种日期。[详见](buildin-object-api/date.md)
D
DCloud_LXH 已提交
111 112 113 114 115 116

### null

一个表明 null 值的特殊关键字。

有时需定义可为null的字符串,可以在类型描述中使用`|`操作符。
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
117

D
DCloud_LXH 已提交
118 119 120 121
```ts
let user: string | null
```

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
122 123 124 125 126 127 128 129 130 131 132 133 134
> 注意:uts 编译为kotlin和swift时不支持 undefined。每个有类型的变量都需要初始化或赋值。

### 数组(Array)

Array,即数组,支持在单个变量名下存储多个元素,并具有执行常见数组操作的成员。

js的array是可变长的泛型array。

在kotlin中,array是不可变长的,length是固定的。只有arrayList是可变长的。

<!-- 补充swift说明 -->

为了拉齐实现,UTS补充了UTSArray,它继承自arrayList,所以可以变长。
D
DCloud_LXH 已提交
135

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
136
但为了接近web的写法,方便跨端,UTSArray在new的时候仍使用了`new Array`
杜庆泉's avatar
杜庆泉 已提交
137

杜庆泉's avatar
杜庆泉 已提交
138 139 140 141 142 143 144 145

#### 创建一个数组对象

`UTS`中数组的创建有两种方式:

1 字面量创建

```
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
146 147
let a = [1,2,3];//支持
let a = [1,'2',3];//支持
杜庆泉's avatar
杜庆泉 已提交
148 149

// 需要注意的是,字面量创建的数组,不支持出现空的缺省元素
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
150
let a = [1,,2,3];//不支持
杜庆泉's avatar
杜庆泉 已提交
151 152 153 154
```

2  创建数组对象
```
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
155 156 157 158
let a = new Array(1,2,3);//支持
let a = new Array(1,'2',3);//支持
let a = Array(1,2,3);//支持
let a = Array(1,'2','3');//支持
杜庆泉's avatar
杜庆泉 已提交
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
```

#### 遍历数组对象

在UTS语言中,推荐使用foreach来实现数组的遍历

```
const array1: string[] = ['a', 'b', 'c'];
array1.forEach((element:string, index:number) => {
    console.log(array1[index])
});
```


#### kotlin 平台的Array 特性
杜庆泉's avatar
杜庆泉 已提交
174 175 176

在kotlin平台上,Array 会被编译为 UTSArray, UTSArray 同时具备原生/web平台 数组特性和方法,需要特别注意的是数组结构转换的场景,我们会在下面列出:

杜庆泉's avatar
杜庆泉 已提交
177
##### 1 我有一个UTSArray 我需要一个kotlin.collections.List
杜庆泉's avatar
杜庆泉 已提交
178 179

```
杜庆泉's avatar
杜庆泉 已提交
180
let utsArr= ["hello","world"]
杜庆泉's avatar
杜庆泉 已提交
181 182 183
let kotlinList = utsArr.toKotlinList()
```

杜庆泉's avatar
杜庆泉 已提交
184
##### 2 我有一个UTSArray 我需要一个java.util.Array
杜庆泉's avatar
杜庆泉 已提交
185 186

```
杜庆泉's avatar
杜庆泉 已提交
187
let utsArr= ["hello","world"]
杜庆泉's avatar
杜庆泉 已提交
188 189 190
let kotlinList = utsArr.toArray()
```

杜庆泉's avatar
杜庆泉 已提交
191
##### 3 我有一个kotlin.collections.List 我需要一个UTSArray
杜庆泉's avatar
杜庆泉 已提交
192 193 194 195 196 197

```
let utsArr= mutableListOf("hello","world")
let kotlinList = utsArr.toUTSArray()
```

杜庆泉's avatar
杜庆泉 已提交
198
##### 4 我有一个java.util.Array 我需要一个UTSArray
杜庆泉's avatar
杜庆泉 已提交
199 200 201 202 203 204

```
let utsArr= arrayOf("hello","world")
let kotlinList = utsArr.toMutableList().toUTSArray()
```

杜庆泉's avatar
杜庆泉 已提交
205

杜庆泉's avatar
杜庆泉 已提交
206

D
DCloud_LXH 已提交
207 208
### Object类型 @object

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
209
对象(object)是指内存中的可以被标识符引用的一块区域,是一种引用类型。包括Array,Date,Map,Set,JSON等。
D
DCloud_LXH 已提交
210 211 212 213 214 215 216 217 218 219

### any类型 @any

如果定义变量时没有声明类型,也没有赋值。那么这个变量会被视为any类型。虽然可以使用,但uts中非常不建议这样使用。

```ts
let s;
s = "123"
console.log(s) // hello world
```