关于逻辑或运算符返回函数结果及find函数真假值的技术咨询
逻辑或运算符的函数结果返回与find函数真假值判断解答
1. 如何在逻辑或(||)运算符中返回其中一个调用函数的结果?
这其实是利用了JavaScript中逻辑或运算符的短路求值特性:
- 当
||左边的表达式结果是「真值」(比如非空字符串、非零数字、对象等,除了null、undefined、false、0、""这些假值之外的所有值),就会直接返回左边的结果,不会再执行右边的表达式。 - 如果左边是「假值」,才会执行右边的表达式,并返回右边的结果。
就像你代码里写的return find(current + 5, ...) || find(current * 3, ...):
- 先调用第一个
find函数,如果它能找到符合条件的路径(返回history字符串,属于真值),就直接把这个字符串作为整个表达式的结果返回,完全不会碰第二个find调用。 - 只有当第一个
find返回null(假值)时,才会去调用第二个find,并返回它的结果。
2. else代码块中find函数的真值/假值判断逻辑
先给你拆解下find函数的返回规则,再结合例子分析:
先明确find函数的返回值类型
- 当
current == target:返回history(一个字符串,绝对是真值) - 当
current > target:返回null(绝对是假值) - 进入
else分支时:通过||串联两个递归调用,返回的是第一个为真值的结果,或者最后一个的结果(如果两个都是假值)
结合你的代码实例(findSolution(24))看else块的逻辑
我们一步步走一遍关键路径:
- 初始调用
find(1, "1"),1 < 24进入else:- 先调用
find(6, "(1 + 5 )"),这条路径递归下去最后所有分支都会走到current >24,最终返回null(假值) - 因为左边是假值,所以执行右边的
find(3, "(1 * 3)")
- 先调用
find(3, "(1 * 3)")中3 <24进入else:- 调用
find(8, "((1 * 3) + 5 )"),这条路径里继续递归:find(8, ...)进入else,调用find(13, ...)(返回null),然后执行find(24, "(((1 * 3) + 5 ) * 3)")- 此时
current=24等于目标值,返回字符串"(((1 * 3) + 5 ) * 3)"(真值)
- 左边的
find(8, ...)返回了真值,所以find(3, ...)直接返回这个结果,整个递归结束
- 调用
总结else块里find函数的真假值场景
- 返回真值:只要当前递归分支中,存在一条路径能让
current最终等于target,就会返回对应的history字符串(真值)。 - 返回假值:当前递归分支下,所有可能的路径(加5或乘3)都会让
current超过target,最终所有子调用都返回null,整个find调用就返回null(假值)。
内容的提问来源于stack exchange,提问作者LaZyFoX
相关产品推荐
相关产品推荐

