条件表达式
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'注意事项
- 括号很重要:嵌套条件表达式时,使用括号明确优先级
- 类型一致性:建议同一个条件表达式的 trueValue 和 falseValue 返回相同类型
- 格式化限制:返回字符串时格式化参数会被忽略
- 性能考虑:复杂的嵌套条件可能影响可读性,考虑使用函数封装