OR运算符如何在这个javascript中工作?

时间:2013-03-25 16:35:26

标签: javascript

给定一个数字,程序应该仅使用* 3或+5返回一系列操作来获取数字,因此有两条路径可以采用。该程序如何知道在调用自身时要调用哪个函数?它如何知道调用每条路径的次数。换句话说,我不明白如何使用OR运算符来确定要使用哪个find()的调用以及每个调用的数量。

function findSequence(goal) {
    // we start at 1, and history is a string that will keep track of the operations
    function find(start, history) {
        // case when start and goal is 1.
        if (start == goal)
            return history; // return string containg 1
        // case when we build start past what we needed
        else if (start > goal)
            return null;
        else
            // Dont understand this part!
            return find(start + 5, "(" + history + " + 5)") ||
                find(start * 3, "(" + history + " * 3)");
    }
    return find(1, "1");
}

document.write(findSequence(13));

2 个答案:

答案 0 :(得分:3)

||运算符检查左操作数的真值。有趣的是,||表达式不会评估为truefalse。如果真值为true,则表达式求值为左操作数。如果不是,则计算为右操作数。例如:

> 5 || 10
5
> 5 || 0
5
> 0 || 10
10
> 0 || undefined
undefined

因此a || b实际上等同于a ? a : b。同样,a && b实际上等同于a ? b : a

> 0 && 10
0
> 0 && undefined
0
> 5 && 10
10
> 5 && undefined
undefined

非布尔值的真值在JavaScript specification

中确定
  • 未定义 - >假
  • Null - >假
  • 字符串 - >如果为空字符串则为False,否则为True
  • 对象>真

编辑:哦,正如mattedgod指出的那样,只要表达式计算结果,表达式的其余部分就不会得到评估。例如:

> function fail() { throw "I failed!"; }
> fail()
XXX "I failed!"
> 5 || fail()
5
> 0 && fail()
0

在上述情况下没有发生故障,但以下情况确实如此:

> 0 || fail()
XXX "I failed!"
> 5 && fail()
XXX "I failed!"

因此,如果你有两次find()的调用,如find(...) || find(...),如果第一次调用的结果具有真值,那么它的结果将被返回而第二次调用将不会执行一点都不如果第一个调用的结果具有错误的真值,则第二个调用将执行,表达式将根据结果进行求值。

答案 1 :(得分:2)

这依赖于JavaScript(以及许多其他语言)的属性,称为“短路”。

如果你考虑一下,如果你正在评估某事是真的而且它是A || B,如果A是真的,那么整个表达式都是正确的,没有意义检查B.反之亦然&&,如果A为假并且您正在评估A && B,则整个表达式都是假的,所以没有理由去打扰B.

在您的示例中,如果第一次调用find成功,则不会执行第二次调用。但是,如果第一个调用没有成功(我猜它返回false或null或者某个计算结果为JS false),第二个调用将被执行。