314 lines
No EOL
4.1 KiB
Markdown
314 lines
No EOL
4.1 KiB
Markdown
# @woocommerce/expression-evaluation
|
|
|
|
在可选上下文中评估类 JavaScript 表达式。
|
|
|
|
简单表达式的例子:
|
|
|
|
```js
|
|
1 + 2
|
|
```
|
|
|
|
```js
|
|
foo === 'bar'
|
|
```
|
|
|
|
```js
|
|
foo ? 'bar' : 'baz'
|
|
```
|
|
|
|
复杂表达式的例子:
|
|
|
|
```js
|
|
foo.bar.baz === 'qux'
|
|
```
|
|
|
|
```js
|
|
foo.bar
|
|
&& ( foo.bar.baz === 'qux' || foo.baz === 'quux' )
|
|
```
|
|
|
|
```js
|
|
foo.bar
|
|
&& ( foo.baz === "qux" || foo.baz === "quux" )
|
|
&& ( foo.quux > 1 && foo.quux <= 5 )
|
|
```
|
|
|
|
```js
|
|
foo.bar
|
|
&& ( foo.baz === "qux" || foo.baz === "quux" )
|
|
&& ( foo.quux > 1 && foo.quux <= 5 )
|
|
? "boo"
|
|
: "baa"
|
|
```
|
|
|
|
```js
|
|
foo
|
|
+ 5
|
|
/* 这是一个注释 */
|
|
* ( bar ? baz : qux )
|
|
```
|
|
|
|
## API
|
|
|
|
### evaluate
|
|
|
|
在可选上下文中评估一个表达式。
|
|
|
|
#### 用法
|
|
|
|
```js
|
|
import { evaluate } from '@woocommerce/expression-evaluation';
|
|
|
|
const result = evaluate( '1 + foo', { foo: 2 } );
|
|
|
|
console.log( result ); // 3
|
|
```
|
|
|
|
#### 参数
|
|
|
|
- _expression_ `string`: 要计算的表达式。
|
|
- _context_ `Object`: 可选。计算表达式时所在的上下文。表达式中的变量将在此对象中查找。
|
|
|
|
#### 返回值
|
|
|
|
- `any`: 表达式求值的结果。
|
|
|
|
## 表达式语法
|
|
|
|
### 语法和类型
|
|
|
|
表达式语法基于 JavaScript。形式化语法定义于 [parser.ts](packages/js/expression-evaluation/src/parser.ts)。
|
|
|
|
一个表达式由单个语句组成。
|
|
|
|
不支持 `if` 语句、`for` 循环、函数调用和变量赋值等产品特点。
|
|
|
|
支持以下类型:
|
|
|
|
- `null`
|
|
- 布尔值:`true` 和 `false`
|
|
- 数值:整数或浮点数。
|
|
- 字符串:表示文本的字符序列。
|
|
|
|
### 字面量
|
|
|
|
表达式中的价值可以写作字面量。
|
|
|
|
#### null
|
|
|
|
```js
|
|
null
|
|
```
|
|
|
|
#### 布尔值
|
|
|
|
```js
|
|
true
|
|
false
|
|
```
|
|
|
|
#### 数值
|
|
|
|
```js
|
|
1
|
|
5.23
|
|
-9
|
|
```
|
|
|
|
#### 字符串
|
|
|
|
字符串字面量可以用单引号或双引号书写。如果字符串包含单引号或双引号,这会很有帮助。
|
|
|
|
```js
|
|
'foo'
|
|
"foo"
|
|
'foo "bar"'
|
|
"foo 'bar'"
|
|
```
|
|
|
|
引号可以用反斜杠转义。
|
|
|
|
```js
|
|
'foo \'bar\''
|
|
"foo \"bar\""
|
|
```
|
|
|
|
### 上下文变量
|
|
|
|
变量可在表达式中使用。变量的值会在上下文中查找。
|
|
|
|
```js
|
|
const result = evaluate( 'foo', { foo: 1 } );
|
|
|
|
console.log( result ); // 1
|
|
```
|
|
|
|
嵌套属性可通过点运算符访问。
|
|
|
|
```js
|
|
const result = evaluate( 'foo.bar', { foo: { bar: 1 } } );
|
|
|
|
console.log( result ); // 1
|
|
```
|
|
|
|
### 运算符
|
|
|
|
支持以下运算符。
|
|
|
|
#### 比较运算符
|
|
|
|
##### 相等 (`==`)
|
|
|
|
如果操作数相等则返回 `true`。
|
|
|
|
```js
|
|
1 == 1
|
|
```
|
|
|
|
##### 不相等 (`!=`)
|
|
|
|
如果操作数不相等则返回 `true`。
|
|
|
|
```js
|
|
1 != 2
|
|
```
|
|
|
|
##### 严格相等 (`===`)
|
|
|
|
如果操作数相等且类型相同,则返回 `true`。
|
|
|
|
```js
|
|
1 === 1
|
|
```
|
|
|
|
##### 严格不相等 (`!==`)
|
|
|
|
如果操作数不相等和/或类型不同,则返回 `true`。
|
|
|
|
```js
|
|
1 !== "1"
|
|
```
|
|
|
|
##### 大于 (`>`)
|
|
|
|
如果左操作数大于右操作数,则返回 `true`。
|
|
|
|
```js
|
|
2 > 1
|
|
```
|
|
|
|
##### 大于或等于 (`>=`)
|
|
|
|
如果左操作数大于或等于右操作数,则返回 `true`。
|
|
|
|
```js
|
|
2 >= 2
|
|
```
|
|
|
|
##### 小于 (`<`)
|
|
|
|
如果左操作数小于右操作数,则返回 `true`。
|
|
|
|
```js
|
|
1 < 2
|
|
```
|
|
|
|
##### 小于或等于 (`<=`)
|
|
|
|
如果左操作数小于或等于右操作数,则返回 `true`。
|
|
|
|
```js
|
|
2 <= 2
|
|
```
|
|
|
|
#### 算术运算符
|
|
|
|
##### 加法 (`+`)
|
|
|
|
返回两个操作数的和。
|
|
|
|
```js
|
|
1 + 2
|
|
```
|
|
|
|
##### 减法 (`-`)
|
|
|
|
返回二个操作数的差。
|
|
|
|
```js
|
|
2 - 1
|
|
```
|
|
|
|
##### 乘法 (`*`)
|
|
|
|
返回二个操作数的积。
|
|
|
|
```js
|
|
2 * 3
|
|
```
|
|
|
|
##### 除法 (`/`)
|
|
|
|
返回两个操作数的商。
|
|
|
|
```js
|
|
6 / 2
|
|
```
|
|
|
|
##### 取模 (`%`)
|
|
|
|
返回两个操作数的余数。
|
|
|
|
```js
|
|
5 % 2
|
|
```
|
|
|
|
##### 取反运算符 (`-`)
|
|
|
|
返回操作数的负值。
|
|
|
|
```js
|
|
-1
|
|
```
|
|
|
|
#### 逻辑运算符
|
|
|
|
##### 逻辑与 (`&&`)
|
|
|
|
如果两个操作数都为 `true`,则返回 `true`。
|
|
|
|
```js
|
|
true && true
|
|
```
|
|
|
|
##### 逻辑或 (`||`)
|
|
|
|
如果任一操作数为 `true`,则返回 `true`。
|
|
|
|
```js
|
|
true || false
|
|
```
|
|
|
|
##### 逻辑非 (`!`)
|
|
|
|
如果操作数为 `false` 则返回 `true`。
|
|
|
|
```js
|
|
!false
|
|
```
|
|
|
|
#### 条件(三元)运算符
|
|
|
|
如果条件为 `true` 则返回第一个值,否则返回第二个值。
|
|
|
|
```js
|
|
true ? 1 : 2
|
|
```
|
|
|
|
### 评论
|
|
|
|
评论可用于记录表达式。评论被视为空格,解析器会忽略它们。
|
|
|
|
```js
|
|
/* This is a comment */
|
|
``` |