提交 b24a1dee 编写于 作者: 张磊

Merge branch 'master' of https://gitee.com/dcloud/unidocs-zh

......@@ -60,6 +60,32 @@
```html
<img src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/uni-app-multiport.jpg" class="zooming" data="abc" width="100" height="100" />
```
12. md 表格支持行、列合并,支持无表头表格
- 行列合并
```md
|Stage | Direct Products | ATP Yields|
|----: | --------------: | ---------:|
|Glycolysis | 2 ATP ||
|^^ | 2 NADH | 3--5 ATP |
|Pyruvaye oxidation | 2 NADH | 5 ATP |
|Citric acid cycle | 2 ATP ||
|^^ | 6 NADH | 15 ATP |
|^^ | 2 FADH2 | 3 ATP |
|**30--32** ATP |||
```
- 无表头表格
```md
|--|--|--|--|--|--|--|--|
|♜| |♝|♛|♚|♝|♞|♜|
| |♟|♟|♟| |♟|♟|♟|
|♟| |♞| | | | | |
| |♗| | |♟| | | |
| | | | |♙| | | |
| | | | | |♘| | |
|♙|♙|♙|♙| |♙|♙|♙|
|♖|♘|♗|♕|♔| | |♖|
```
## 文档 Algolia 使用限额
Included Quota:
- Records: 1,000,000
......
......@@ -96,6 +96,17 @@ const config = {
.end()
.plugin('inject-json-to-md')
.use(require('./markdown/inject-json-to-md'))
.end()
.plugin('multimd-table')
.use(require('markdown-it-multimd-table'), [
{
multiline: false,
rowspan: true,
headerless: true,
multibody: false,
aotolabel: false,
},
])
}
},
chainWebpack (config, isServer) {
......
......@@ -144,3 +144,15 @@ uni.chooseLocation({
DCloud为开发者争取了福利,可优惠获取高德的商业授权。如有需求请发邮件到`bd@dcloud.io`(注明你的公司名称、应用介绍、HBuilder账户);你也可以直接通过`uni-im`发起在线咨询,在线咨询地址:[DCloud地图服务专员](https://im.dcloud.net.cn/#/?user_id=b9839630-a479-11ea-b772-0f6ad6cf835c)
详见:[https://uniapp.dcloud.net.cn/tutorial/app-geolocation.html#lic](https://uniapp.dcloud.net.cn/tutorial/app-geolocation.html#lic)
### unicloud-city-select 城市选择组件
若想要实现城市选择功能,可以使用 `unicloud-city-select` 城市选择组件。
**运行效果图**
![](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/3707/410.png)
> 下载地址:[https://ext.dcloud.net.cn/plugin?name=unicloud-city-select](https://ext.dcloud.net.cn/plugin?name=unicloud-city-select)
> 文档地址:[https://uniapp.dcloud.net.cn/uniCloud/unicloud-city-select.html](https://uniapp.dcloud.net.cn/uniCloud/unicloud-city-select.html)
......@@ -36,7 +36,7 @@ selector类似于 CSS 的选择器,但仅支持下列语法。
1. app-uvue支持的选择器较少,不支持ID选择器,[详见](../../uni-app-x/css/readme.md#选择器)
2. app-uvue的页面滚动,是由页面最外层的scroll-view模拟的,如果页面最外层不是scroll-view,无法使用本api。[详见](../../uni-app-x/css/readme.md#pagescroll)
3. app-uvue的scroll-view滚动时,如需动画,则需要在scroll-view的属性中配置 `scroll-with-animation="true"`[详见](../../component/scroll-view.md)
4. scroll-view的滚动,另见API
4. scroll-view的滚动,设置其scrollTop即可。[详见](../../component/scroll-view.md)
**示例**
......
### map
## map
地图组件。
......@@ -256,9 +256,9 @@ export default {
```
:::
## App平台地图服务商差异
### App平台地图服务商差异
### Map 地图组件
#### Map 地图组件
|属性 |说明 |高德是否支持 |google地图是否支持 |
|:---- |:---- |:---- |:---- |
......@@ -268,25 +268,25 @@ export default {
|labeltap |点击label时触发 |已支持 |Android支持iOS不支持 |
|poitap |点击地图poi点时触发 |已支持 |Android不支持 iOS支持 |
### marker
#### marker
|属性 |说明 |高德是否支持 |google地图是否支持 |
|:---- |:---- |:---- |:---- |
|label |为标记点旁边增加标签 |已支持 |Android支持 iOS不支持 |
### marker 上的气泡 callout
#### marker 上的气泡 callout
|属性 |说明 |高德是否支持 |google地图是否支持 |
|:---- |:---- |:---- |:---- |
|display |'BYCLICK':点击显示; 'ALWAYS':常显 |已支持 |Android支持iOS只支持 'BYCLICK' |
### marker 上的自定义气泡 customCallout
#### marker 上的自定义气泡 customCallout
|属性 |说明 |高德是否支持 |google地图是否支持 |
|:---- |:---- |:---- |:---- |
|display|'BYCLICK':点击显示; 'ALWAYS':常显 |已支持 |Android支持iOS只支持 'BYCLICK' |
### polyline
#### polyline
|属性 |说明 |高德是否支持 |google地图是否支持 |
|:---- |:---- |:---- |:---- |
......@@ -340,3 +340,26 @@ DCloud为开发者争取了福利,可优惠获取商业授权。如有需求
联系电话:17778170760
详见:[https://uniapp.dcloud.net.cn/tutorial/app-geolocation.html#lic](https://uniapp.dcloud.net.cn/tutorial/app-geolocation.html#lic)
### unicloud-map 云端一体组件
若想要在地图上展示自定义的POI信息,试试 `unicloud-map` 云端一体组件,该组件将前端地图组件与云端数据库无缝连接,只需写一个`<unicloud-map>`组件,即可从数据库中获取附近的POI信息并在地图上呈现。无论是静态还是动态的POI,甚至更多自定义功能,都轻松实现。让地图开发变得愉快又高效。
> 下载地址:[https://ext.dcloud.net.cn/plugin?name=unicloud-map](https://ext.dcloud.net.cn/plugin?name=unicloud-map)
> 文档地址:[https://uniapp.dcloud.net.cn/uniCloud/unicloud-map.html](https://uniapp.dcloud.net.cn/uniCloud/unicloud-map.html)
**渲染静态POI运行效果图**
通过从数据库获取POI数据,渲染到地图上
![](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/3707/409.png)
**渲染动态POI运行效果图**
通过从数据库获取POI数据,并通过 uni-id-common 内的路线规划API,计算路线、距离、时间
**运行效果图**
![](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/3707/408.png)
......@@ -205,7 +205,7 @@ const app = createApp({})
|内置组件 |描述 |H5 |App端|微信小程序 |
| -- | -- | -- |-- |-- |
|component | 渲染一个“元组件”为动态组件。依 `is` 的值,来决定哪个组件被渲染。 [详情](https://v3.cn.vuejs.org/api/built-in-components.html#component) |√ | √ | x | |
|component | 渲染一个“元组件”为动态组件。依 `is` 的值,来决定哪个组件被渲染。 [详情](https://cn.vuejs.org/api/built-in-special-elements.html#component) |√ | √ | x | |
|transition | 作为单个元素/组件的过渡效果。 [详情](https://v3.cn.vuejs.org/api/built-in-components.html#transition) |√ | x | x | |
|transition-group | 作为多个元素/组件的过渡效果。 [详情](https://v3.cn.vuejs.org/api/built-in-components.html#transition-group) |√ | x | x | |
|keep-alive | 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们,主要用于保留组件状态或避免重新渲染。 [详情](https://v3.cn.vuejs.org/api/built-in-components.html#keep-alive) |√ |x | x | |
......
......@@ -110,6 +110,6 @@ this.myNode?.style?.setProperty('background-color', 'red');
## DOM接口
- [INode](dom/inode.md)
- [CSSStyleDeclaration](dom/cssstyle.md)
- [CSSStyleDeclaration](dom/cssstyledeclaration.md)
- [DrawableContext](dom/drawablecontext.md)
## CSSStyleDeclaration
CSSStyleDeclaration表示一个CSS 声明块对象,它是一个 CSS 属性键值对的集合。它暴露了样式信息和各种与样式相关的方法和属性。
| 方法 | 说明 |
|-------------------------------------- |-------------------------- |
| [setProperty](#setProperty) | 设置CSS的某个样式值 |
| [getPropertyValue](#getPropertyValue) | 获取CSS的某个样式值 |
### setProperty(name, value)@setProperty
对CSS指定样式设置一个新值。
```ts
CSSStyleDeclaration.setProperty(name:string, value:any):void
```
**参数说明**
| 参数 | 类型 | 说明 |
|-------|-------- |------ |
| name | string | CSS样式名称|
| value | any | CSS样式值 |
**返回值**
### getPropertyValue(property)@getPropertyValue
获取CSS指定的样式值,如果指定的样式不存在则返回null。
```ts
CSSStyleDeclaration.getPropertyValue(property:string):any?
```
**参数说明**
| 参数 | 类型 | 说明 |
|---------------|-------- |------ |
| property | string | CSS样式名称|
**返回值**
| 类型 | 说明 |
|------ |---------- |
| any | CSS样式值,可能为null |
......@@ -26,7 +26,7 @@ node.style;
设置指定组件上的某个属性值。如果设置的属性已经存在,则更新该属性值;否则使用指定的名称和值添加一个新的属性。
```ts
node.setAttribute("name", "helloButton");
INode.setAttribute(name:string, value:any|null):void
```
**参数说明**
......@@ -34,7 +34,7 @@ node.setAttribute("name", "helloButton");
| 参数 | 类型 | 说明 |
|-------|-------- |------ |
| name | string | 属性名称 |
| value | Any | 属性的值 |
| value | any | 属性的值 |
**返回值**
......@@ -46,7 +46,7 @@ node.setAttribute("name", "helloButton");
获取元素指定的属性值,如果指定的属性不存在则返回null。
```ts
var attribute = node.getAttribute(attributeName);
INode.getAttribute(attributeName:string):any?
```
**参数说明**
......@@ -67,12 +67,12 @@ var attribute = node.getAttribute(attributeName);
获取组件的绘制对象,仅uvue页面中的 `view` 组件支持,其它组件不支持则返回null。
```ts
var drawContext = node.getDrawableContext();
INode.getDrawableContext():DrawableContext|null
```
**返回值**
| 类型 | 说明 |
|------ |---------- |
| [DrawableContext](drawablecontext.md)? | 绘制对象,可为null |
| [DrawableContext](drawablecontext.md) | 绘制对象,可能为null |
......@@ -4,13 +4,13 @@
## 配置项列表
|属性 |类型 |默认值 |描述 |最低版本 |
|:- |:- |:- |:- |:- |
|name |String |- |应用名称 | |
|appid |String |- |应用标识,新建项目时DCloud云端分配 | |
|description|String |- |应用描述 | |
|versionName|String |- |版本名称,例如:1.0.0 | |
|versionCode|String |- |版本号,仅包含数字字符,例如:100 | |
|uni-app-x |[UNI-APP-X配置](#uniappx) |- |uni-app x项目配置 | |
|app |[APP配置](#app) |- |App项目(原生App端)配置 | |
|name |String |- |应用名称 |3.9.0 |
|appid |String |- |应用标识,新建项目时DCloud云端分配 |3.9.0 |
|description|String |- |应用描述 |3.9.0 |
|versionName|String |- |版本名称,例如:1.0.0 |3.9.0 |
|versionCode|String |- |版本号,仅包含数字字符,例如:100 |3.9.0 |
|uni-app-x |[UNI-APP-X配置](#uniappx) |- |uni-app x项目配置 |3.9.0 |
|app |[APP配置](#app) |- |App项目(原生App端)配置 |3.9.0 |
**注意**
- `appid` 由 DCloud 云端分配,主要用于 DCloud 相关的云服务,请勿自行修改。[详见](https://ask.dcloud.net.cn/article/35907)
......@@ -22,8 +22,7 @@
|属性 |类型 |默认值 |描述 |最低版本 |
|:- |:- |:- |:- |:- |
|singleThread |Boolean |true |是否为单线程模式 | |
|flex-direction |String |column |uvue页面默认flex排列方向,可取值:row:从左到右; row-reverse:从右到左;column:从上到下;column-reverse:与 column 相反| |
|flex-direction |String |column |uvue页面默认flex排列方向,可取值:row:从左到右; row-reverse:从右到左;column:从上到下;column-reverse:与 column 相反|3.9.0 |
### APP配置@app
......@@ -31,7 +30,7 @@ App端(原生App)配置
|属性 |类型 |默认值 |描述 |最低版本 |
|:- |:- |:- |:- |:- |
|distribute |[DISTRIBUTE配置](#distribute) |- |App端发布配置 | |
|distribute |[DISTRIBUTE配置](#distribute) |- |App端发布配置 |3.9.0 |
### DISTRIBUTE配置@distribute
......@@ -39,9 +38,9 @@ App端发布配置
|属性 |类型 |默认值 |描述 |最低版本 |
|:- |:- |:- |:- |:- |
|syncDebug |Boolean |false |是否为自定义调试基座 | |
|android |[ANDROID配置](#android) |- |App-Android端发布配置 | |
|ios |[IOS配置](#ios) |- |App-iOS端发布配置 | |
|syncDebug |Boolean |false |是否为自定义调试基座 |3.9.0 |
|android |[ANDROID配置](#android) |- |App-Android端发布配置 |3.9.0 |
|ios |[IOS配置](#ios) |- |App-iOS端发布配置 |3.9.0 |
### ANDROID配置@android
......@@ -49,14 +48,14 @@ App-Android端发布配置
|属性 |类型 |默认值 |描述 |最低版本 |
|:- |:- |:- |:- |:- |
|packagename |String |- |Android包名 | |
|keystore |String |- |证书库文件路径,相对于.manifest目录 | |
|storepwd |String |- |证书库文件密码 | |
|aliasname |String |- |证书别名 | |
|keypwd |String |- |证书密码 | |
|abiFilters |Array<String> |- |支持的CPU类型 | |
|minSdkVersion |String |- |最低Android版本(Android API Level)| |
|targetSdkVersion |String |- |目标版本(Android API Level) | |
|packagename |String |- |Android包名 |3.9.0 |
|keystore |String |- |证书库文件路径,相对于.manifest目录 |3.9.0 |
|storepwd |String |- |证书库文件密码 |3.9.0 |
|aliasname |String |- |证书别名 |3.9.0 |
|keypwd |String |- |证书密码 |3.9.0 |
|abiFilters |Array<String> |- |支持的CPU类型 |3.9.0 |
|minSdkVersion |String |- |最低Android版本(Android API Level)|3.9.0 |
|targetSdkVersion |String |- |目标版本(Android API Level) |3.9.0 |
**注意**
- `minSdkVersion` 用于指定应用运行所需最低 API 级别的整数。如果系统的 API 级别低于该属性中指定的值,Android 系统将阻止用户安装应用。
......@@ -70,7 +69,7 @@ App-iOS端发布配置
|属性 |类型 |默认值 |描述 |最低版本 |
|:- |:- |:- |:- |:- |
|appid |String |- |iOS Bundle ID | |
|appid |String |- |iOS Bundle ID |3.9.0 |
## 示例
......
......@@ -1747,7 +1747,29 @@ let res = await db.collection('user').where({
geometry: line
})
}).get()
```
```
#### unicloud-map 云端一体组件
若想要在地图上展示自定义的POI信息,试试 `unicloud-map` 云端一体组件,该组件将前端地图组件与云端数据库无缝连接,只需写一个`<unicloud-map>`组件,即可从数据库中获取附近的POI信息并在地图上呈现。无论是静态还是动态的POI,甚至更多自定义功能,都轻松实现。让地图开发变得愉快又高效。
> 下载地址:[https://ext.dcloud.net.cn/plugin?name=unicloud-map](https://ext.dcloud.net.cn/plugin?name=unicloud-map)
> 文档地址:[https://uniapp.dcloud.net.cn/uniCloud/unicloud-map.html](https://uniapp.dcloud.net.cn/uniCloud/unicloud-map.html)
**渲染静态POI运行效果图**
通过从数据库获取POI数据,渲染到地图上
![](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/3707/409.png)
**渲染动态POI运行效果图**
通过从数据库获取POI数据,并通过 uni-id-common 内的路线规划API,计算路线、距离、时间
**运行效果图**
![](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/3707/408.png)
## 事务@transaction
......
......@@ -2667,6 +2667,28 @@ const res = await db.collection('geo-near').aggregate().geoNear({
- 存在geoNear时其query参数将取代where/doc作为权限校验依据,即query匹配到的结果需要满足权限才可以查询
#### unicloud-map 云端一体组件
若想要在地图上展示自定义的POI信息,试试 `unicloud-map` 云端一体组件,该组件将前端地图组件与云端数据库无缝连接,只需写一个`<unicloud-map>`组件,即可从数据库中获取附近的POI信息并在地图上呈现。无论是静态还是动态的POI,甚至更多自定义功能,都轻松实现。让地图开发变得愉快又高效。
> 下载地址:[https://ext.dcloud.net.cn/plugin?name=unicloud-map](https://ext.dcloud.net.cn/plugin?name=unicloud-map)
> 文档地址:[https://uniapp.dcloud.net.cn/uniCloud/unicloud-map.html](https://uniapp.dcloud.net.cn/uniCloud/unicloud-map.html)
**渲染静态POI运行效果图**
通过从数据库获取POI数据,渲染到地图上
![](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/3707/409.png)
**渲染动态POI运行效果图**
通过从数据库获取POI数据,并通过 uni-id-common 内的路线规划API,计算路线、距离、时间
**运行效果图**
![](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/3707/408.png)
### 查询某字段和另一个表的字段相等的记录@enhanced-in
> 新增于 HBuilderX 3.7.12
......
......@@ -40,7 +40,7 @@ uni-im是云端一体的、全平台的、免费的、开源即时通讯系统
优先开发哪些,取决于开发者的反馈。同时也欢迎开发者共建这个开源项目。
> uni-im相关功能建议或问题,可以加入由uni-im(本插件)搭建的交流群,[点此加入](https://im.dcloud.net.cn/#/?joinGroup=63ef49711d358337456f4d67),备用QQ群(当系统处于维护中使用)群号:[854520009](https://qm.qq.com/cgi-bin/qm/qr?k=DJNSajXAYHnYcr9pouOfxF9Rwwl1AJHc&jump_from=webapi&authKey=HZ1fG58Eudp3o0GCoyx1/UPMY9Fv1sGT5jdqYqPJlTGT0XVUip3Bk8E+UyToQOMo)
> uni-im相关功能建议或问题,可以加入由uni-im(本插件)搭建的交流群,[点此加入](https://im.dcloud.net.cn/#/?joinGroup=63ef49711d358337456f4d67)
## 使用uniCloud产生的费用说明@cost
......
......@@ -245,7 +245,7 @@ export default {
</style>
```
#### 渲染动态POII@dynamicspoi
#### 渲染动态POI@dynamicspoi
通过从数据库获取POI数据,并通过 uni-id-common 内的路线规划API,计算路线、距离、时间
......
......@@ -11,12 +11,12 @@
比如 `"abc"``"你好"`,都属于字符串string,所有string类型有相同的方法、属性,比如`.length`属性获取字符串长度。
UTS 的类型有:
- 基础类型:boolean、number、string、any、null,都是小写,typeof返回类型名称
- 基础类型:boolean、number、string、any、null,都是小写,前3个typeof返回类型名称,null的typeof是object,any的typeof是当时值的类型。
- 对象类型:Date、Array、Map、Set、USTJSONObject,首字母大写,typeof返回"object",判断准确类型需使用 instanceof
- 使用 type 来自定义类型
- 特殊类型:function、class、error。
- 平台专有类型:Int、Float、Double、NSString、kotlin.Array...,typeof返回"object",判断准确类型需使用 instanceof
<!-- TODO map -->
除了特殊类型,其他类型都可以在变量后面通过`:`加类型名称来给这个变量声明类型。
### 布尔值(boolean)
......@@ -142,7 +142,7 @@ let d:Int8 = 1 // Int8是swift平台专有类型
不管是 ts 、kotlin 还是 swift,都具备字面量自动推导类型的能力,为 a 自动推导合适的类型。
**目前版本中,在未显式声明类型的情况下使用数字字面量赋值、传参,由平台语言自动推导为相应的类型**
**在HBuilderX 3.9版之前,在未显式声明类型的情况下使用数字字面量赋值、传参,由平台语言自动推导为相应的类型**
但不同平台,推导结果不一样。
......@@ -154,22 +154,46 @@ let d:Int8 = 1 // Int8是swift平台专有类型
a 会被自动推导成什么类型?是Int、double、还是number?值是0还是0.1?在不同平台的差异更大。
在web端,a 的类型是 number,值是0.1,但在 kotlin 中,类型是 Int,值是0.
在web端,a 的类型是 number,值是0.1,但在 kotlin 中,类型是 Int,值是0。
**HBuilderX 3.9起 uts 提供了新的字面量类型推导规则:**
**为了统一各平台对字面量的自动推导规则,后续 uts 将接管和统一字面量类型推导。所有数字字面量、以及数字字面量组成的运算表达式,均默认推导为 number类型。**
**在定义变量时,且没有显式声明变量类型,通过数字字面量以及数字字面量组成的运算表达式来给变量赋值,此时变量类型默认推导为 number类型。**
未来,如您需要使用平台专有数字类型,需显式声明,如:
举例说明:
- HBuilderX3.9前,运行到App,由kotlin和swift编译器推导
```ts
let c:Int = 42 //显式声明为Int
let a = 1 // 类型为Int
let b = 1/10 // 类型为Int,值为0
```
- HBuilderX3.9起,运行到App,未显式声明类型的变量,需根据数字字面量推导变量类型,此时由 uts 编译器推导,变量类型默认为 number
```ts
let a = 1 // 类型为number
let b = 1/10 // 类型为number,值为0.1
```
如您已经显式声明变量类型,无需自动推导,则不受上述规则变化影响。不管HBuilderX 3.9之前还是之后,以下代码都是一样的
```ts
let a:Int = 1 // 类型为Int
let b:Int = 1/10 // 类型为Int,值为0
```
`let a = 1`,a从Int变成number,这是一个**无法向下兼容的更新**,请开发者注意调整。
如果您希望写出同时适配 HBuilder 3.9之前之后版本的代码,只需要显式声明数字的类型。
除了变量类型自动推导,在函数入参的场景,由于参数已经有明确类型,其实无需自动推导类型,入参的数字字面量类型不会变。
```ts
function test(score: Int): boolean {
return (score>=60)
}
test(c)
test(60) // 这个60可以正常传入
test(60.0) // 要求是Int,传入了非Int数字字面量,报错
```
当您调用系统或三方SDK的方法时,如果这些方法的入参要求Int,您之前直接通过字面量赋值`let a = 42`,就是 Int,但未来会变成 number,
导致类型不匹配报错。所以强烈建议您现在就更改代码写法,不依赖kotlin和swift的字面量自动推导,直接显式声明类型,改为`let a:Int = 42`
<!-- TODO 字面量除法 -->
#### 各种数字类型之间的转换
......@@ -197,8 +221,6 @@ a.toFloat() // 转换为 Float 类型,后续也将支持 new Float(a) 方式
a.toDouble() // 转换为 Double 类型,后续也将支持 new Double(a) 方式转换
```
<!-- TODO:缺少如何把专有类型转为number @杜庆泉 -->
##### swift下转换数字类型
```ts
// number转成特定类型
......@@ -218,7 +240,7 @@ let a:Int = 3
let b = new Double(a) // 将整型变量 a 转换为 Double 类型
```
#### 从平台特有类型便捷创建 Number
#### Number.from
为了将 kottlin 或者 Swift 平台专有的数字类型便捷的转成Number,我们提供了 Number.from() 的静态方法。该方法适用于上一章节中所列出的所有的专有数字类型。
```ts
......@@ -248,8 +270,17 @@ let e1 = Number.from(e)
* 编译至 Kotlin 平台时,整型的数值范围为 -9223372036854775808 到 9223372036854775807,超出范围会报错:`The value is out of range‌`。浮点型的数值范围为 ±1.7976931348623157e+308,超出范围会返回 `Infinity``-Infinity`。平台专有数字类型范围 [详见](#Kotlin)
* 编译至 Swift 平台时,整型的数值范围为 -9223372036854775808 到 9223372036854775807,浮点型的数值范围为 ±1.7976931348623157e+308,超出范围会报错:`integer literal overflows when stored into 'NSNumber'`。平台专有数字类型范围 [详见](#Swift)
#### 运算和比较
既然数字类型有很多,就涉及跨类型的数字之间的运算和比较的问题。
跨类型数字的运算,比如加减乘除取余,是什么样的?Int+number可以吗?详见 [算数运算符](operator.md#arithmeticdifftype)
跨类型数字的比较,大于小于等于不等于的规则是什么样的?详见 [比较运算符](operator.md#comparisondifftype)
#### 更多API
number内置对象有不少API,[详见](buildin-object-api/number.md)
Number内置对象还有很多API,[详见](buildin-object-api/number.md)
### 字符串(string) @string
......@@ -776,7 +807,7 @@ Map对象还有很多API,delete、clear等,[详见](buildin-object-api/map.m
json 在 js 中并非一个独立的类型,对一个 json 对象 typeof 返回的是 object。
json 在 js 中用起来很自由,但在强类型语言中,不管kotlin、swift、dart...,都没有这么灵活。
json 在 js 中用起来很自由,但在强类型语言中,不管kotlin、swift、dart...,都没有这么灵活。
1. json对象里的每个属性,都需要定义类型
2. 每个可为空的属性,都需要加`?.`,才能安全读写
......@@ -785,7 +816,7 @@ json 在 js 中用起来很自由,但在强类型语言中,不管kotlin、sw
在 uts 中使用 JSON,有3种方式:
1. 把 json数据转 type,变成一个自定义类型。这不是本章节的内容,详见 [type](type-aliases.md)
1. 把 json数据转 type,变成一个自定义类型。这不是本章节的内容,详见 [type](#type)
2. uts 新增了 UTSJSONObject 对象,可以把 json数据通过字面量赋值 或 JSON.parse()方式,赋值给 uts 内置的 UTSJSONObject 对象。
3. 由于 USTJSONObject有toMap()方法,所以也可以转为Map后使用json数据。
......@@ -835,7 +866,7 @@ let jo = [{
#### 定义 UTSJSONObject
可以通过对象字面量的方式定义一个 UTSJSONObject 对象,编译器会根据字面量自动推导类型。
可以通过对象字面量的方式定义一个 UTSJSONObject 对象,编译器会根据字面量自动推导类型,此时无需显式声明`:UTSJSONObject`
```ts
let jo = {
......@@ -849,7 +880,14 @@ let jo2 = {
}
```
如果属性名包括`-`,则必须两侧加引号包围。尽管在 kotlin 中属性名称包含`$``_`等也需要转义,但是 UTS 中是无需特殊处理的,编译器会自动转换。
关于属性名是否需要使用引号包围的规则:
1. 如果是对象字面量赋值,普通属性名称无需使用引号包围,但使用也没问题
2. 如果是对象字面量赋值,且属性名包括`-`,则必须两侧加引号包围。
3. 如果是JSON.parse()方法入参需要的字符串,则属性名必须使用双引号包围(web端规则也是如此)
如果开发者不想搞明白这些细节,可以简单粗暴的都给属性名都加上引号。
尽管在 kotlin 中属性名称包含`$``_`等也需要转义,但是 UTS 中是无需特殊处理的,编译器会自动转换。
对于纯字面量,jo 后面的 `:UTSJSONObject` 可以省略,这些类型比较简单,可以自动推导类型。包括下面的多层嵌套,类型也不会推导出错。
......@@ -865,14 +903,14 @@ let rect = {
console.log(rect)
```
也就是对于形如`{x:samething}`的对象字面量,如果赋值时不指定类型,在 uts 中会被自动推导为 UTSJSONObject。如果你需要转 type,则需显式声明。
也就是对于形如`{x:something}`的对象字面量,如果赋值时不指定类型,在 uts 中会被自动推导为 UTSJSONObject。如果你需要转 type,则需显式声明。
除了字面量定义UTSJSONObject对象,经常用到的是通过 `JSON.parse()`,把一个 JSON 字符串转成UTSJSONObject对象。
uts 内置了大写的 `JSON` 对象,有parse()、stringify()等方法。注意`JSON``UTSJSONObject`不是一个对象。大写 `JSON` 内置对象,web端也是存在的。而 UTSJSONObject 是 uts 新增的。
```ts
let s = `{"result":true, "count":42}` // 常见场景中,这个字符串更多来自于网络或其他应用传输。
let s = `{"result":true, "count":42}` // 常见场景中,这个字符串更多来自于网络或其他应用传输。注意属性名称必须使用引号包围
let jo = JSON.parse(s) // 这个代码适用于HBuilderX 3.9以前
```
......@@ -1085,10 +1123,12 @@ let i:tn = 0 // 等同于 let i:number = 0
上述简单的例子在实际开发中没有意义。
在 ts 中常见的用途是给联合类型命名,方便后续简化使用。但 uts 在app端不支持联合类型,在 uts 中用的比较多的场景是[函数类型](./function.md#%E5%87%BD%E6%95%B0%E7%B1%BB%E5%9E%8B)定义别名,以便在共享给其他模块使用。
在 ts 中常见的用途是给联合类型命名,方便后续简化使用。但 uts 在app端不支持联合类型,在 uts 中用的比较多的场景是
1.[函数类型](./function.md#%E5%87%BD%E6%95%B0%E7%B1%BB%E5%9E%8B)定义别名,以便在共享给其他模块使用。
2. 用于json对象的定义,在编译为kotlin和swift时,会编译为class。
uts 中,type一般用于对象的定义,在编译为kotlin和swift时,会编译为class
本章节重点讲解如何把json数据转为type
#### 把json对象转为type
......@@ -1113,9 +1153,11 @@ console.log(person.name) //返回zhangsan
可以看到,变量person,和js里使用json没有任何区别了。支持`.`操作符,无需下标,可跨平台。
所以在ts开发中,很多开发者就会把缺少类型的json数据变成一个type,继续像js里那样使用这个json数据。
与UTSJSONObject相比,虽然多了一个type定义的过程,但使用体验更流畅,也可以在ide中自由的`.`,并且得到良好的提示。
所以在ts开发中,很多开发者就会把缺少类型的json数据变成一个type或interface,继续像js里那样使用这个json数据。
在uts中,由于interface的概念在kotlin和swift有其他用途,所以uts中推荐开发者把json转成一个type,而不是interface。
但在uts中,由于interface的概念在kotlin和swift有其他用途,所以uts中推荐开发者把json转成一个type,而不是interface。
#### 把json数组转为type
......@@ -1138,7 +1180,7 @@ console.log(personList[0].name); //返回zhangsan
type PersonType = {
id : number,
name : string,
age : number | null
age : number | null //属性可为null
}
let personList = [
......@@ -1232,11 +1274,29 @@ let person = {
} as PersonType
```
#### 通过JSON.parse转type
HBuilderX 3.9+,支持JSON.parse传入泛型,把一段字符串解析为type。
```ts
type PersonType = {
id: number,
name: string
}
let jsonString:string = `{
"id": 1,
"name": "zhangsan",
}` // 注意属性必须使用引号包围,否则parse会解析失败返回null
let person = JSON.parse<PersonType>(jsonString) //这是一种泛型的写法,在方法名后面使用<>传入PersonType类型,就可以返回传入的类型。
console.log(person?.name); // 返回zhangsan。由于person可能为null,parse可能失败,所以需要通过?.来访问属性
```
#### json转type工具
如果json数据属性较多、嵌套较多,那么为json数据编写type类型定义,也是一件繁琐的事情。
HBuilderX 3.9起内置了一个json转type工具,在json编辑器中右键,选择json转type,即可根据json数据内容自动推导生成type定义。
HBuilderX 3.9起内置了一个json转type工具,在`json编辑器`中右键,选择`json转type`,即可根据json数据内容自动推导生成type定义。
#### 为vue的data中的json定义类型
......@@ -1262,15 +1322,40 @@ uvue文件中data中的json数据也涉及类型定义。此时注意:type定
}
</script>
```
<!--
大多数情况下,data里的json数据是空的,联网从服务器取到一段json字符串,然后再赋值并转type。
```html
大多数情况下,data里的json数据是空的,联网从服务器取到一段json字符串,然后再赋值并转type。下面是一段示例。
```html
<template>
<text>{{person?.name}}</text>
</template>
<script>
// 注意给data定义type,要写在export default的上面
type PersonType = {
id: number,
name: string,
age: number,
}
export default {
data() {
return {
person: null as PersonType | null, // data初始时没有值,只能设为null,然后类型就需要 | null。
}
},
onLoad() {
let jsonString:string = `{
"id": 1,
"name": "zhangsan",
"age": 18
}` // 注意属性必须使用引号包围,否则parse会解析失败返回null
// 实际开发中,需写联网代码获取字符内容。
this.person = JSON.parse<PersonType>(jsonString) //这是一种泛型的写法,在方法名后面使用<>传入PersonType类型就可以返回传入的类型
console.log(this.person?.name); // 返回zhangsan。由于person可能为null,需要通过?.来访问属性
}
}
</script>
```
TODO type自定义类型的方法
-->
### 其他
- 关于undefined
......@@ -1278,5 +1363,3 @@ TODO type自定义类型的方法
js中的 undefined类型表示变量被定义,但是未赋值或初始化。
uts 编译为kotlin和swift时不支持 undefined。即不允许变量未赋值。每个有类型的变量都需要初始化或赋值。
......@@ -17,7 +17,7 @@
| 按位异或赋值(Bitwise XOR assignment) | x ^= y | x = x ^ y |
| 按位或赋值(Bitwise OR assignment) | x \|= y | x = x \| y |
### 比较运算符(Comparison operators)@Comparison-operators
### 比较运算符(comparison operators)@Comparison-operators
| 运算符 | 描述 | 返回 true 的示例 |
| ----------------------------------- | ------------------------------------------- | ---------------- |
......@@ -36,7 +36,11 @@
| -------- | ---- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| 求余(%) | | 二元运算符. 返回相除之后的余数. |
| 自增(++) | | 一元运算符. 将操作数的值加一. 如果放在操作数前面 (++x), 则返回加一后的值; 如果放在操作数后面 (x++), 则返回操作数原值,然后再将操作数加一. |
| 自减(--) | | 一元运算符. 将操作数的值减一. 前后缀两种用法的返回值类似自增运算符. |
| 自减(--) | | 一元运算符. 将操作数的值减一. 前后缀两种用法的返回值类似自增运算符.
| 加(+) | | 二元运算符. 将两个数相加. |
| 减(-) | | 二元运算符. 将两个数相减. |
| 乘(*) | | 二元运算符. 将两个数相乘. |
| 除(/) | | 二元运算符. 将两个数相除. |
### 位运算符(Bitwise operators)@Bitwise-operators
......@@ -155,3 +159,85 @@ const status = age >= 18 ? "adult" : "minor";
* 无符号右移运算符(>>>)(零填充右移)将第一个操作数向右移动指定(二进制)位数。
- `>>>=`
### 算数运算符的跨数字类型注意@arithmeticdifftype
uts 中算数运算符在大部分场景下和 ts 中的行为一致,但是在有字面量或者是平台专有数字类型参与运算时,不同平台可能会有不同的表现。
算数运算符 + - * / % 行为一致,下表以 + 和 / 为例列出了各种场景下的详细差异。
- 其中 number 是指 number 类型的变量,字面量是指数字字面量,变量是指平台专有数字类型的变量
- 运算符 / 在 字面量 / 字面量场景下, 结果为 number.
| 场景 | 示例 | Kottlin 结果 | Swift 结果 |
| ----------------------------------- | ------------------------------------------- | ------------------------------ |------------------------------------------|
| number + number | number + number | 结果为 number |结果为 number |
| number + 字面量 | number + 1 | 结果为 number |结果为 number |
| | number + 3.14 | 结果为 number |结果为 number |
| number + 变量 | let a: Int = 1; number + a | 结果为 number |结果为 number |
| | let b: Double = 1;  number + b | 结果为 number |结果为 number |
| | let c: Long = 1; number + c | 结果为 number |Swift 中无 Long |
| | let d: Int64 = 1; number+ d | kottlin 中无 Int64 |结果为 number |
| 字面量 + number | 1 + number | 结果为 number |结果为 number |
| | 3.14 + number | 结果为 number |结果为 number |
| 变量 + number | let a: Int = 1; a + number | 结果为 number |编译失败,需要用 (a as number) + number |
| | let b: Double = 1; b + number | 结果为 number |编译失败,需要用 (b as number) + number |
| | let c: Long = 1;  c + number | 结果为 number |Swift 中无 Long |
| | let d: Int64 = 1; d + number | kottlin 中无 Int64 |编译失败,需要用 (d as number) + number |
| 字面量 + 字面量 | 1 + 1 | 结果为 2 Int |结果为2 Int |
| | 1 + 3.14 | 结果为4.14 Double |结果为4.14 Double |
| | 1.0 + 3.14 | 结果为4.14 Double |结果为4.14 Double |
| 字面量 / 字面量 | 1 / 10 | 无明确类型时为 0.1 number,有类型时遵守类型约定|无明确类型时为 0.1 number,有类型时遵守类型约定|
| 专有类型变量 / 字面量 | let a: Int = 2; a / 10 | 结果为 0 Int |结果为0 Int |
| | let a: Int = 2; a / 10.0 | 结果为 0.2 Double |编译失败,Int / Double 不合法 需使用 a / Int(10.0) |
| 专有类型变量 + 字面量 | let a: Int = 2; a + 10 | 结果为 12 Int |结果为12 Int |
| | let a: Int = 2; a + 3.14 | 结果为 5.14 Double |编译失败, 需要 a + Int(3.14) = 5 |
| 相同的专有类型变量相加 | let a: Int = 1; let b: Int = 2; a + b | 结果为 3 Int |结果为3 Int |
| | let a: Double = 1.0; let b: Double = 2.0; a + b | 结果为 3.0 Double |结果为 3.0 Double |
| 不同的专有类型变量相加 | let a: Int = 1; let b: Float = 3.14.toFloat(); a + b | 结果为4.14, Float |编译失败,不同类型变量不能操作 |
| | let a: Float = 1.0.toFloat(); let b: Double = 3.14; a + b| 结果为4.14,Double |编译失败,不同类型变量不能操作 |
### 比较运算符的跨数字类型注意@comparisondifftype
uts 中比较运算符在大部分场景下和 ts 中的行为一致,但是在有字面量或者是平台专有数字类型参与比较操作时,不同平台可能会有不同的表现。
#### 比较运算符 > >= < <=
比较运算符 > >= < <= 行为一致下表以 > 为例列出了各种场景下的详细差异。
- 其中 number 是指 number 类型的变量,字面量是指数字字面量,变量是指平台专有数字类型的变量
| 场景 | 示例 | Kottlin 结果 | Swift 结果 |
| ----------------------------------- | ------------------------------------------- | ------------------------------ |-----------------------------------------|
| number > number | number > number | 结果为 true or false |结果为 true or false |
| number > 字面量 | number > 1 | 结果为 true or false |结果为 true or false |
| number > 变量 | let a: Int = 1; number > a | 结果为 true or false |结果为 true or false |
| 字面量 > number | 3.14 > number | 结果为 true or false |结果为 true or false |
| 变量 > number | let a: Int = 1; a > number | 结果为 true or false |结果为 true or false |
| 字面量 > 字面量 | 3.14 > 1 | 结果为 true |结果为 true |
| 专有类型变量 > 字面量 | let a: Int = 2; a > 3.14 | 结果为 false |结果为 false |
| 相同的专有类型变量比较 | let a: Int = 2; let b: Int = 1; a > b | 结果为 true |结果为 true |
| 不同的专有类型变量比较 | let a: Int = 1; let b: Float = 3.14.toFloat(); a > b | 结果为false |编译失败,不同类型变量不能比较 |
#### 比较运算符 == != === !==
| 场景 | 示例 | Kottlin 结果 | Swift 结果 |
| ------------------------------------ | ------------------------------------------- | ------------------------------ |------------------------------------------|
| number == number (!= === !== 行为相同) | number == number | 值相同就true |值相同就true |
| number == 字面量 (!= === !== 行为相同) | number == 1 | 值相同就true |值相同就true |
| number == 变量 (!= === !== 行为相同) | let a: Int = 1; number == a | 值相同就true |值相同就true |
| 字面量 == number (!= === !== 行为相同) | 1 == number | 值相同就true |值相同就true |
| 变量 == number (!= === !== 行为相同) | let a: Int = 1; a == number | 值相同就true |值相同就true |
| 字面量 == 字面量 (!= 行为相同) | 1 == 1 (相同类型) | 值相同就true |值相同就true |
| | 1 == 3.14 (不同类型) | 编译失败,不支持比较 |值相同就为true |
| 字面量 === 字面量 (!== 行为相同) | 1 === 1 (相同类型) | 值相同就true |编译失败,=== 和 !== 只能用于引用类型比较 |
| | 1 === 3.14 (不同类型) | 编译失败,不支持比较 |编译失败,=== 和 !== 只能用于引用类型比较 |
| 专有类型变量 == 字面量 (!= 行为相同) | let a: Int = 2; a == 10 (相同类型) | 值相同就true |值相同就true |
| | let a: Int = 2; a == 3.14 (不同类型) | 编译失败,不支持比较 |值相同就true |
| 专有类型变量 === 字面量 (!== 行为相同) | let a: Int = 2; a === 10 (相同类型) | 值相同就true |编译失败,=== 和 !== 只能用于引用类型比较 |
| | let a: Int = 2; a === 3.14 (不同类型) | 编译失败,不支持比较 |编译失败,=== 和 !== 只能用于引用类型比较 |
| String == String (!= 行为相同) | "a" == "a" | 结果为 true |结果为 true |
| String === String (!=== 行为相同) | "a" === "a" | 结果为 true |编译失败,不能比较 |
| Array == Array (!= 行为相同) | [1] == [1] | 结果为 false |结果为 true,数组类型相同,元素相同就为true |
| Array === Array (!=== 行为相同) | [1] === [1] | 结果为 false |编译失败,不能比较 |
\ No newline at end of file
......@@ -6489,6 +6489,11 @@ markdown-it-emoji@^1.4.0:
resolved "https://registry.yarnpkg.com/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz#9bee0e9a990a963ba96df6980c4fddb05dfb4dcc"
integrity sha1-m+4OmpkKljupbfaYDE/dsF37Tcw=
markdown-it-multimd-table@^4.2.3:
version "4.2.3"
resolved "https://registry.npmmirror.com/markdown-it-multimd-table/-/markdown-it-multimd-table-4.2.3.tgz#b81ac1f6c26482ddf0504c9e25583ad126c03dec"
integrity sha512-KepCr2OMJqm7IT6sOIbuqHGe+NERhgy66XMrc5lo6dHW7oaPzMDtYwR1EGwK16/blb6mCSg4jqityOe0o/H7HA==
markdown-it-table-of-contents@^0.4.0:
version "0.4.4"
resolved "https://registry.yarnpkg.com/markdown-it-table-of-contents/-/markdown-it-table-of-contents-0.4.4.tgz#3dc7ce8b8fc17e5981c77cc398d1782319f37fbc"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册