跳到主要内容

变量与表达式

九头虫 RPA 使用 {{ }} 双花括号语法在流程中动态引用变量和计算表达式。所有节点的参数输入框均支持此语法。

表达式引擎基于 jsep 实现,兼容 JavaScript 表达式语义。本页详细介绍每种写法的输入(你写什么)和输出(运行时得到什么)。


基础规则

两种模式

{{ }} 有两种工作模式,区别在于是否保留原始类型:

纯表达式——整个输入框只写一个 {{...}},计算结果是什么类型就输出什么类型:

{{score}} → 95 (数字)
{{score + 5}} → 100 (数字)
{{isActive}} → true (布尔值)

混合文本——{{ }} 嵌在普通文字中,所有变量值被转为字符串拼接:

共 {{count}} 条 → "共 10 条" (字符串)
Score: {{score}}/100 → "Score: 95/100" (字符串)

这是最重要的一条规则:纯表达式保留原始类型,混合文本一律输出字符串。

支持的变量类型

表达式中的变量可以是以下任意类型,不同类型在两种模式下的输出行为不同:

变量值 纯表达式输出 混合文本输出
─────────────────────────────────────────────────────
"Alice" "Alice" (字符串) "Alice"
95 95 (数字) "95"
true true (布尔值) "true"
{name: "张三"} {name: "张三"} JSON字符串
[1, 2, 3] [1, 2, 3] "[1,2,3]"
null null "(空)"
undefined undefined "(空)"

数字、字符串、布尔值在纯表达式中原样保留,可以继续参与运算。对象和数组在混合文本中会被序列化为 JSON 字符串。nullundefined 在混合文本中表现为空。

变量从哪来

表达式中的变量名从上下文查找。上下文在流程运行期间动态构建,来源包括:

  • 设置变量」节点显式声明(支持手动输入、页面元素提取、代码块、引用其他变量)
  • 数据采集」节点自动产出的数据集
  • 等待 HTTP」节点抓取到的响应数据
  • 发送 HTTP」节点的返回结果

变量在声明它的节点之后的所有位置可见。分支内部用「局部变量」限定作用域,分支外部不可见。


算术运算

price = 100, quantity = 3

{{price + 10}} → 110
{{price - 10}} → 90
{{price * quantity}} → 300
{{price / 3}} → 33.333...
{{score % 10}} → 6 (score = 96)
{{base ** 2}} → 16 (base = 4)
警告

+ 既是加法也是字符串拼接。如果变量实际值是字符串——比如 count = "1",那么 {{count + 1}} 结果是 "11" 而非 2。在「设置变量」节点中确保类型选的是「数字」。


比较运算

比较运算输出 truefalse,常用于「条件分支」节点:

score = 75

{{score > 60}} → true
{{score < 60}} → false
{{score >= 60}} → true
{{score <= 60}} → false


status = 'ok'

{{status === 'ok'}} → true
{{status !== 'ok'}} → false
{{status == 'ok'}} → true
{{status != 'ok'}} → false

推荐使用 ===!==(严格比较),避免隐式类型转换的意外结果。


逻辑运算

逻辑运算支持短路求值:&& 遇到假值就停,|| 遇到真值就停,后面的不计算。

isActive = true, count = 10

{{isActive && count > 5}} → true
{{isActive && count < 5}} → false


isExpired = false, isCancelled = true

{{isExpired || isCancelled}} → true
{{isExpired || false}} → false

取反运算

! 放在表达式前面,对布尔值取反。!! 双取反常用于把任意值强制转为布尔值。

isEmpty = false, score = 80

{{!isEmpty}} → true
{{!isActive}} → false (isActive = true)
{{!(score < 60)}} → true (score < 60 是 false,取反得到 true)
{{!!score}} → true (数字非零,双取反 → true)

属性访问

用点号访问对象属性,用方括号访问数组元素或动态属性名:

user = { name: 'Alice', profile: { city: '北京' } }

{{user.name}} → "Alice"
{{user.profile.city}} → "北京"


list = ['A', 'B', 'C']

{{list[0]}} → "A"
{{list[1]}} → "B"


index = 2

{{list[index]}} → "C"

属性不存在时输出 undefined,在混合文本中表现为空字符串。


三元运算

条件判断的简写,条件 ? 真值 : 假值

score = 75

{{score >= 60 ? '及格' : '不及格'}} → "及格"


count = 0

{{count > 0 ? count : '无'}} → "无"


isVip = true

{{isVip ? 'VIP用户' : '普通用户'}} → "VIP用户"

三元表达式输出什么类型取决于真值/假值的类型。例如 {{a > 0 ? a : 0}} 输出数字,{{a > 0 ? '有' : '无'}} 输出字符串。


内置函数

以下函数可在表达式中直接调用,无需声明:

{{getPageUrl()}} → "https://example.com/orders"
{{getUUID()}} → "550e8400-e29b-41d4-a716-446655440000"
{{getTimeStamp()}} → 1718123456789
{{random(1000, 9999)}} → 5842 (随机整数)
{{Number('123')}} → 123 (字符串转数字)
{{String(456)}} → "456" (数字转字符串)

NumberString 常用于类型转换——比如「设置变量」节点产出的值是字符串,但后续需要参与算术运算,用 Number 转一下即可:

count = '10' (字符串)

{{count + 1}} → "101" (字符串拼接,不是你想要的)
{{Number(count) + 1}} → 11 (先转数字再加,正确)

内置函数可像普通变量一样参与运算:

{{getTimeStamp() + 60000}} → 1718123516789
{{'当前页面:' + getPageUrl()}} → "当前页面:https://..."
{{random(0, 100) >= 50 ? '通过' : '未通过'}} → "通过" 或 "未通过"

常见问题

变量引用了但显示为空

现象:在节点参数中写了 {{变量名}},但运行时替换为空。

原因:变量未在引用前声明,或作用域不匹配(在分支外部引用了分支内部的局部变量)。

解决

  1. 确认「设置变量」节点在流程顺序上位于引用之前;
  2. 使用「打印输出」节点在引用前打印变量值,确认变量存在且类型正确。

在 JSON 中使用变量

现象:在 JSON 配置字段中写了变量表达式,但运行时报错或结果不符合预期。

原因:变量在 JSON 中的解析与正常 JSON 类型声明一致——变量解析成什么类型,最终值就是什么类型。字符串变量必须加引号,否则会产生不合法 JSON。

解决:按 JSON 的正常写法使用变量:

// 字符串变量需要引号
{"name": "{{username}}"}{"name": "Alice"}

// 数字变量不需要引号
{"count": {{total}}}{"count": 5}

// 布尔值不需要引号
{"active": {{isActive}}}{"active": true}

// 错误:字符串变量不加引号 → 不合法 JSON
{"name": {{username}}}{"name": Alice}

表达式计算结果与预期类型不符

现象{{count + 1}} 结果为字符串 "11" 而非数字 2

原因:变量 count 的实际值是字符串 "1"+ 运算执行了字符串拼接。

解决:使用「设置变量」节点时选择正确的变量类型(数字而非字符串),确保上游节点产出的变量类型符合预期。