# 表达式


## 概述
织信采用`UEL`（统一表达式语言）语法的表达式，UEL在语法和语义上类似于JavaScript表达式。
::: info 特点
- 无需类型转换；转换通常是隐式的完成
- 双引号和单引号用法相同
- `object.property`与`object['property']`的意义相同
- 在`${}`之外的部分会按照字符串的形式返回
:::


下面是统一表达式语言的一个简单的例子：
::: info 对象
``` javascript
let person = {
  name: '张三',
  age: 18
}
```
:::
:::: tabs

::: tab 示例一
```javascript
${person.name}
// 输出结果
'张三'
```
:::

::: tab 示例二
```javascript
${person.age}
// 输出结果
18
```
:::

::: tab 示例三
```javascript
${person.name}的年龄是${person.age}
// 输出结果
'张三的年龄是18'
```
:::

::::
## 类型返回
表达式可以直接声明并返回变量
:::: tabs

::: tab 布尔值
```javascript
${ true }
// 输出结果
true
```
:::

::: tab 整数
```javascript
${ 123 }
// 输出结果
123
```
:::
::: tab 字符串
```javascript
${ '123' }
// 输出结果
'123'
```
:::

::: tab 整数数组
```javascript
${ [1,2,3] }
// 输出结果
[1,2,3]
```
:::
::: tab 字符串数组
```javascript
${ ['1','2','3'] }
// 输出结果
['1','2','3']
```
:::
::: tab 对象
```javascript
${ {"prop1":1,"prop2":"str"}}
// 输出结果
{"prop1":1,"prop2":"str"}
```
:::

::: tab 对象数组
```javascript
${ [{"name","item1"},{"name","item2"}]}
// 输出结果
[{"name","item1"},{"name","item2"}]
```
:::

::::

## 字符串拼接
织信中的表达式分为`在客户端执行`和`在服务器端执行`两种情况，在客户端执行时可以在表达式中使用`+`可以将字符串和任意对象拼接为新的字符串。例如

:::: tabs

::: tab 示例一
```javascript
${'123' + '456'}
// 输出结果
'123456'
```
:::

::: tab 示例二
```javascript
${'123' + 456}
// 输出结果
'123456'
```
:::

::: tab 示例三
```javascript
${'a' + 4567}
// 输出结果
'a4567'
```
:::

::: tab 示例四
```javascript
${1 + '' + 2}
// 输出结果
'12'
```
:::

::::

::: warning 注意
在服务器端执行时不支持使用`+`字符串拼接
```javascript
${'123'+'456'} //返回'579'
```
:::


如果需要执行字符串拼接需要使用`String.concat(s1,s2)`
```javascript
${String.concat('123','456')} //返回'123456'
```

## 运算符

::: info
- 运算: +（加法）, - （减法）, *（乘法）, /（除法）, %(取模)
- 逻辑: &&(并且), ||(或者), !（取反）
- 关系: ==（等于）, !=（不等于）, <（小于）, >（大于） <=（小于等于）, >=（大于等于）
- 空值: null（空值）
- 条件判断: A ? B : C. 返回 B or C, 如果A为true 返回B，否则返回C
:::


## 保留关键字
保留关键字不能作为变量名
::: info 保留关键字
`and` `or` `not` `true` `false` `null` `empty` `div` `mod` `in` `matches` `eq`	`ne` `lt` `gt` `le`	`ge` `class`
:::

## 除0异常
在除法操作中，如果除数是0的话会抛出异常

## 运算示例

| 表达式         | 结果    |
| -------------- | ------- |
| 1 > (4/2)      | false   |
| 4.0 >= 3       | true    |
| 100.0 == 100   | true    |
| (10*10) ne 100 | false   |
| 4 > 3          | true    |
| 1 + 2 > 2 - 1  | true    |
| 1 < 2 && 2 > 1 | true    |
| 1 < 2          | false   |
| 2 > 1          | true    |
| 'a' < 'b'      | true    |
| 1 + 2          | 3       |
| 1.2E4 + 1.4    | 12001.4 |
| 3 / 4        | 0.75    |
| 10 % 4       | 2       |

## 函数调用
织信提供了`Math` `Array` `Date` `Misc` `String` `User` `Encode` `Record`等对象来处理关于数学运算、数组、日期等方面的函数运算。函数调用过程如果发生异常，系统会回滚当前事务。以下是一个函数调用的示例

```javascript
${Math.abs(-100)}//返回100
```