Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
sss宋
unidocs-zh
提交
da6a545d
unidocs-zh
项目概览
sss宋
/
unidocs-zh
与 Fork 源项目一致
Fork自
DCloud / unidocs-zh
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
unidocs-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
da6a545d
编写于
8月 19, 2023
作者:
W
wanganxp
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
修缮措辞
上级
a521e601
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
48 addition
and
34 deletion
+48
-34
docs/uts/README.md
docs/uts/README.md
+2
-0
docs/uts/_sidebar.md
docs/uts/_sidebar.md
+6
-6
docs/uts/data-type.md
docs/uts/data-type.md
+40
-28
未找到文件。
docs/uts/README.md
浏览文件 @
da6a545d
...
...
@@ -219,6 +219,8 @@ const s: string | null = null // s为一个可为null的字符串
console
.
log
(
s
?.
length
)
//除非前面已经给s赋值,否则调用s的方法和属性必须加?
```
安全调用有很多细节,详见
[
null类型
](
data-type.md#null类型
)
### 代码语句的分割
uts的多个代码语句,以回车或分号分割。
...
...
docs/uts/_sidebar.md
浏览文件 @
da6a545d
...
...
@@ -3,13 +3,13 @@
*
[
字面量
](
literal.md
)
*
[
操作符
](
operator.md
)
*
[
控制流程
](
control.md
)
*
[
函数
](
function.md
)
*
[
类型别名
](
type-aliases.md
)
*
[
对象
](
object.md
)
*
[
类
](
class.md
)
*
[
接口
](
interface.md
)
*
[
函数
function
](
function.md
)
*
[
类型别名
type
](
type-aliases.md
)
*
[
对象
object
](
object.md
)
*
[
类
class
](
class.md
)
*
[
接口
interface
](
interface.md
)
*
[
类型兼容性
](
type-compatibility.md
)
*
[
模块
](
module.md
)
*
[
模块
module
](
module.md
)
*
内置对象和 API
*
[
Number
](
buildin-object-api/number.md
)
*
[
String
](
buildin-object-api/string.md
)
...
...
docs/uts/data-type.md
浏览文件 @
da6a545d
...
...
@@ -277,7 +277,9 @@ console.log(myDate instanceof Date) // Date用typeof会返回object,需使用i
const
year
:
number
=
myDate
.
getFullYear
()
```
[
详见
](
buildin-object-api/date.md
)
在js中,Date其实是内置对象,typeof一个日期,返回的是
`object`
。
Date对象还有很多方法属性,
[
详见
](
buildin-object-api/date.md
)
### 数组(Array)
...
...
@@ -329,7 +331,7 @@ let a3 = Array(1,2,3);//支持
let
a4
=
Array
(
1
,
'
2
'
,
'
3
'
);
//支持
```
字面量创建的数组,在uts的老版本上,kotlin自动推导数组类型,可能会推导成intArray,而不是uts的array。建议显式声明类型。
字面量创建的数组,在uts的老版本上,kotlin自动推导数组类型
时
,可能会推导成intArray,而不是uts的array。建议显式声明类型。
typeof 一个 array 得到的是 object。需使用 Array.isArray 或 instanceof 来判断数组类型。
...
...
@@ -424,7 +426,6 @@ let kotlinArray = utsArr.toTypedArray()
```
##### iOS 平台专有数组类型
UTS 中的 Array 对应到 Swift 中就是 Array, 方法是通用的,无需转换。一般情况下,使用 Array 即可。
...
...
@@ -522,26 +523,32 @@ let a3: NSMutableArray = NSMutableArray(array= a)
#### 更多API
更多Array的
API,
[
详见
](
https://uniapp.dcloud.net.cn/uts/buildin-object-api/array.html
)
Array作为内置对象,还有更多
API,
[
详见
](
https://uniapp.dcloud.net.cn/uts/buildin-object-api/array.html
)
### JSON@json
json 在 js 中用起来很自由,但在强类型语言中,不管kotlin、swift、dart...,都没有这么灵活。
本章节虽然标题为JSON,但并非 uts 中有一个类型叫
`JSON`
,本节更多是介绍 uts 中 json 的使用方式,以及介绍内置的 USTJSONObject 对象。
json 在 js 中也并非一个独立的类型,对一个 json 对象 typeof 返回的是 object。
json 在 js 中用起来很自由,但在强类型语言中,不管kotlin、swift、dart...,都没有这么灵活。要求如下:
json对象里的每个属性,都需要定义类型,才能安全读写。
1.
json对象里的每个属性,都需要定义类型
2.
每个可为空的属性,都需要加
`?.`
,才能安全读写
JSON 是 js 对象的一种表示方法,在 js 中可以直接用作对象表达式来初始化一个对象,而其他大多数语言都要求把json对象
转为class、interface或type。
一般其他强类型语言都要求把json数据
转为class、interface或type。
uts 当然也可以把 json 转 interface/type。有很多转换工具,不管是在线网页还是ide插件。
在 uts 中使用 JSON,有2种方式:
同时 uts 也提供了内置的 UTSJSONObject,它尽可能的为开发者提供接近js的灵活性。
1.
把 json数据 转 type,变成一个类型。有很多转换工具,不管是在线网页还是ide插件。
2.
使用 uts 内置的 UTSJSONObject 对象,不转type的情况下,尽可能的为开发者提供接近js的灵活性。
#### 对象和数组
首先,我们需要区分JSON对象和由JSON对象组成的数组。
首先,我们需要区分JSON对象
,
和由JSON对象组成的数组。
这是一个 UTSJSONObject 对象。jo 对象有2个属性,x和y,都是数字类型
这是一个 UTSJSONObject 对象。jo 对象有2个属性,x和y,都是数字类型
(类型没有声明是因为根据字面量自动推导了)
```
ts
let
jo
:
UTSJSONObject
=
{
"
x
"
:
1
,
...
...
@@ -549,7 +556,7 @@ let jo: UTSJSONObject = {
}
```
这是一个 UTSJSONObject 数组。其数组项里有2个 UTSJSONObject 对象,每个对象都有x和y这2个属性。
这是一个 UTSJSONObject 数组。其数组项里有2个 UTSJSONObject 对象,每个对象都有x和y这2个属性。
注意
`=`
左边有
`[]`
来表示这是一个数组类型。
```
ts
let
jr
:
UTSJSONObject
[]
=
[
{
"
x
"
:
1
,
"
y
"
:
2
},
...
...
@@ -564,15 +571,15 @@ let jr: UTSJSONObject[] = [
let
jo
:
UTSJSONObject
=
[{
"
x
"
:
1
,
"
y
"
:
2
}]
//错误,类型不匹配
}]
//错误,类型不匹配
,数组不能赋值给对象
let
jo
:
UTSJSONObject
[]
=
[{
"
x
"
:
1
,
"
y
"
:
2
}]
//正确
}]
//正确
,数组赋值给数组
let
jo
:
Array
<
UTSJSONObject
>
=
[{
"
x
"
:
1
,
"
y
"
:
2
}]
//正确
}]
//正确
,数组赋值给数组
let
jo
=
[{
"
x
"
:
1
,
"
y
"
:
2
...
...
@@ -644,12 +651,15 @@ jo = JSON.parse({"result":true, "count":42})
除了字面量定义对象,经常用到的是通过
`JSON.parse()`
,把一个 JSON 字符串转成对象。
uts 内置了大写的
`JSON`
对象,有parse()、stringify()等方法。注意这和 UTSJSONObject 不是一个对象。大写
`JSON`
内置对象,web端也是存在的。而 UTSJSONObject 是 uts 新增的。
```
ts
let
s
=
`{"result":true, "count":42}`
// 常见场景中,这个字符串更多来自于网络或其他应用传输。
let
jo
=
JSON
.
parse
(
s
)
// 这个代码适用于HBuilderX 3.9以前
```
在 HBuilderX 3.9以前,
`JSON.parse()`
返回的
`UTSJSONObject`
。但因为有时网络或其他应用传入的是 JSON 根节点是数组,而不是对象,会导致崩溃。
在 HBuilderX 3.9以前,
`JSON.parse()`
返回的
`UTSJSONObject`
。但因为有时网络或其他应用传入的是 JSON 数据根节点是数组,而不是对象,会导致崩溃。
所以从 HBuilderX 3.9起,
`JSON.parse()`
返回的类型改为
`any`
,即可能返回对象、也可能返回数组。这样就需要开发者自行再
`as`
一下来指定具体类型了。
新的写法是这样:
...
...
@@ -661,7 +671,7 @@ let sr = `[{"x":1, "y":2},{"x":3, "y":4}]` // 常见场景中,这个字符串
let
jr
=
JSON
.
parse
(
s
)
as
UTSJSONObject
[]
```
当然,还有更简短的写法,使用
JSON
的parseObject()和parseArray()方法:
当然,还有更简短的写法,使用
HBuilderX 3.9新增的
`JSON`
的parseObject()和parseArray()方法:
```
ts
let
s
=
`{"result":true, "count":42}`
// 常见场景中,这个字符串更多来自于网络或其他应用传输。
let
jo
=
JSON
.
parseObject
(
s
)
...
...
@@ -691,8 +701,8 @@ let rect = {
即
`rect.x`
、
`rect.size.width`
。
这种写法比较简单,和js习惯一致,但在 UTS 中限制较多。它的使用有如下前提:
-
通过type声明了对象的数据结构,也就是需要单独定义一个type
再使用。详见type章节。这也是大多数强类型使用对象字面量初始化
的方式。
-
如未定义type,则仅限于web和Android,在iOS上swift不支持
`.`
操作符。在Android上也只支持字面量定义json。如果是
`JSON.parse()`
转换的,则不能使用。
-
通过type声明了对象的数据结构,也就是需要单独定义一个type
,转为type后再使用。详见type章节。这也是大多数强类型语言使用json
的方式。
-
如未定义type,则仅限于web和Android,在iOS上swift不支持
`.`
操作符。在Android上也只支持字面量定义json
(因为类型可推导)
。如果是
`JSON.parse()`
转换的,则不能使用。
2.
[""]下标属性
即
`rect["x"]`
。
...
...
@@ -868,36 +878,38 @@ let b: string | null = "abc" // 可以设置为空
b
=
null
// ok
```
但这不代表 uts
支持广泛的联合类型。实际上目前仅有可为空才能这么写
。
但这不代表 uts
在App端支持广泛的联合类型,实际上仅有可为空才能这么写。即
`let b : string | number`
仅能在编译为js时使用,因为kotlin和swift都不支持联合类型
。
现在,如果你调用 a 的方法或者访问它的属性,它保证不会导致 NPE,这样你就可以放心地使用:
```
ts
const
l
=
a
.
length
const
l
=
a
.
length
//返回3
```
但是如果你想访问 b 的同一个属性,那
么这
是不安全的,并且编译器会报告一个错误:
但是如果你想访问 b 的同一个属性,那是不安全的,并且编译器会报告一个错误:
```
ts
const
l
=
b
.
length
// 错误:变量“b”可能为空
```
但是,还是需要访问该属性,对吧?有几种方式可以做到。
我们要庆幸编译器的报错,因为如果编译器放过后,在线上运行时万一真的为空,那会导致崩溃。
如何正确访问可能为null的对象的属性和方法?有几种方式可以做到。
####
在条件中检测 null
####
代码中判空后再使用
首先,你可以显式检测 b 是否为 null:
如果你的代码已经判空,则编译器不会再告警。你可以显式检测 b 是否为 null,在不为 null 的情况下调用 b 的属性和方法。
```
ts
if
(
b
!=
null
)
{
console
.
log
(
b
.
length
)
console
.
log
(
b
.
length
)
//返回3
}
```
编译器会跟踪所执行检测的信息,并允许你在 if 内部调用 length。
####
安全的
调用
####
不判空,使用`?.`进行安全
调用
访问可空变量的属性的第二种选择是使用安全调用操作符
`?.`
...
...
@@ -910,7 +922,7 @@ console.log(b?.length) // b可能为null,null没有length属性,在没有判
如果 b 非空,就返回 b.length,否则返回 null,
`b?.length`
这个表达式的类型是 number | null。
安全调用在链式调用中很有用。例如,一个员工 Bob 可能会(或者不会)分配给一个部门。 可能有另外一个员工是该部门的负责人。获取 Bob 所在部门负责人(如果有的话)的名字,
写作:
安全调用在链式调用中很有用。例如,一个员工 Bob 可能会(或者不会)分配给一个部门。 可能有另外一个员工是该部门的负责人。获取 Bob 所在部门负责人(如果有的话)的名字,写作:
```
ts
bob
?.
department
?.
head
?.
name
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录