Skip to content

条件表达式

a-calc 3.x 引入了完整的条件表达式(三元运算符)支持,让你可以在表达式中进行条件判断。

基本语法

条件表达式的语法与 JavaScript 完全一致:

condition ? trueValue : falseValue

condition 为真时返回 trueValue,否则返回 falseValue

基本用法

javascript
import { calc } from 'a-calc'

// 简单条件判断
calc('1 > 0 ? 100 : 200')  // '100'
calc('1 < 0 ? 100 : 200')  // '200'

// 使用变量
calc('x > 0 ? x * 2 : 0', { x: 5 })   // '10'
calc('x > 0 ? x * 2 : 0', { x: -3 })  // '0'

// 比较结果作为条件
calc('score >= 60 ? "及格" : "不及格"', { score: 75 })  // '及格'

嵌套条件

条件表达式支持嵌套,遵循右结合规则(与 JavaScript 一致):

javascript
// 嵌套在 trueValue 中
calc('a > b ? (b > c ? b : c) : a', { a: 5, b: 3, c: 1 })  // '3'

// 嵌套在 falseValue 中
calc('x > 0 ? x : (x < 0 ? -x : 0)', { x: -5 })  // '5' (取绝对值)

// 多层嵌套(类似 if-else if-else)
calc('score >= 90 ? "A" : (score >= 80 ? "B" : (score >= 60 ? "C" : "D"))', { score: 85 })  // 'B'

返回值类型

条件表达式可以返回多种类型的值:

返回数字

javascript
calc('x > 0 ? x : 0', { x: 10 })  // '10'
calc('x > 0 ? x : 0', { x: -5 })  // '0'

返回字符串

javascript
calc('status == 1 ? "启用" : "禁用"', { status: 1 })  // '启用'
calc('gender == "M" ? "先生" : "女士"', { gender: 'M' })  // '先生'

返回布尔值

javascript
calc('x > 0 ? true : false', { x: 5 })  // true

与运算符组合

条件表达式可以与各种运算符组合使用:

与算术运算组合

javascript
// 条件值参与后续计算
calc('(x > 0 ? x : 0) + 10', { x: 5 })   // '15'
calc('(x > 0 ? x : 0) + 10', { x: -5 })  // '10'

// 条件判断后的值进行运算
calc('x > 0 ? x * 2 : x / 2', { x: 10 })  // '20'

与逻辑运算组合

javascript
// 复合条件
calc('(x > 0 && y > 0) ? x + y : 0', { x: 3, y: 4 })  // '7'
calc('(x > 0 || y > 0) ? 1 : 0', { x: -1, y: 2 })     // '1'

与函数组合

javascript
// 条件中使用函数
calc('x > 0 ? sqrt(x) : 0', { x: 16 })  // '4'
calc('abs(x) > 10 ? x : 0', { x: -15 }) // '-15'

// 函数参数中使用条件
calc('max(x > 0 ? x : 0, y > 0 ? y : 0)', { x: -5, y: 10 })  // '10'

格式化处理

条件表达式的结果可以进行格式化,但仅当返回数字时生效

javascript
// 返回数字时格式化生效
calc('x > 0 ? x : 0 | =2', { x: 3.14159 })  // '3.14'

// 返回字符串时忽略格式化
calc('x > 0 ? "正数" : "非正数" | =2', { x: 5 })  // '正数'

短路求值

条件表达式实现了短路求值,只有被选中的分支会被计算:

javascript
// 不会触发除零错误,因为 falseValue 不会被计算
calc('x > 0 ? x : 1/0', { x: 5 })  // '5'

// 不会触发除零错误,因为 trueValue 不会被计算
calc('x < 0 ? 1/0 : x', { x: 5 })  // '5'

运算符优先级

条件表达式的优先级较低,确保条件和值的表达式被正确解析:

运算符优先级
||2
&&3
? :1
javascript
// 逻辑运算符优先级高于条件运算符
calc('a && b ? 1 : 0', { a: true, b: true })  // '1'
// 等价于: (a && b) ? 1 : 0

// 需要括号来改变优先级
calc('a ? b && c : d', { a: true, b: true, c: false, d: 1 })  // false
// 等价于: a ? (b && c) : d

实际应用示例

价格计算

javascript
// 根据会员等级计算折扣
calc('level >= 3 ? price * 0.8 : (level >= 2 ? price * 0.9 : price)', { level: 3, price: 100 })  // '80'

// 满减优惠
calc('total >= 100 ? total - 20 : total', { total: 150 })  // '130'

状态转换

javascript
// 订单状态显示
const statusText = calc('status == 1 ? "待支付" : (status == 2 ? "已支付" : (status == 3 ? "已发货" : "已完成"))', { status: 2 })
// '已支付'

数据校验

javascript
// 确保值在有效范围内
calc('value > max ? max : (value < min ? min : value)', { value: 150, min: 0, max: 100 })  // '100'

// 等价于使用 clamp 函数
calc('clamp(value, min, max)', { value: 150, min: 0, max: 100 })  // '100'

注意事项

  1. 括号很重要:嵌套条件表达式时,使用括号明确优先级
  2. 类型一致性:建议同一个条件表达式的 trueValue 和 falseValue 返回相同类型
  3. 格式化限制:返回字符串时格式化参数会被忽略
  4. 性能考虑:复杂的嵌套条件可能影响可读性,考虑使用函数封装

基于 MIT 许可发布