JQ 1.5中替代运算符//的异常行为原因问询
JQ 1.5中
//运算符流场景的行为解析 核心差异://是带短路的流级运算符,和普通二元逻辑运算不同
1. 普通二元运算符(如<)的逐元素处理逻辑
当你写(.a, .b, .c, .d) < -1时,JQ会将流中的每个元素分别与-1比较,等价于展开成:
.a < -1, .b < -1, .c < -1, .d < -1
因此会输出4个结果,每个元素独立计算,没有短路行为。
2. //运算符的流级短路逻辑
//作为替代运算符,针对整个结果流的行为是:
- 遍历左侧流的元素,直到找到第一个「真值」(非
false、非null的值); - 返回从流开始到该真值的所有元素,然后立即停止处理后续元素;
- 如果整个流全是假值,才会返回右侧的替代值。
在你的例子中,流的第一个元素是42(真值),//触发短路,直接返回42就停止了,后续的false、null、null都不会被处理,自然不会用-1替代。
3. 管道写法能得到预期结果的原因
(.a, .b, .c, .d) | . // -1通过管道|将流中的每个元素单独传递给// -1,相当于对每个元素单独执行替代逻辑:
- 每个元素都会被判断:是假值就替换为
-1,否则保留原值; - 四个元素都会被处理,最终得到你预期的
42、-1、-1、-1。
内容的提问来源于stack exchange,提问作者A.H.
相关产品推荐
相关产品推荐

